Files
ARR-2.0-0918/.project-docs/30-worklog/current-state.md
T

1341 lines
129 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Current State
## 2026-09-18 — 按用户指定仓库整理最新代码交付
用户明确确认酒店由OHIP平台决定、本机核对OHIPSB02,生产切换时再调整;两条路径(接口数据、用户XML)并行且共用后续规则。
本次发布目标为https://git.nianxx.cn/shiyuyun/ARR-2.0-0918,初查无远端分支;保留原wyndham-ARR远端,不强推覆盖。
发布范围包括当前源码、处理器包、019迁移、模拟测试、接口参数清单和生产交付说明;本机私有凭据、原始业务响应、队列、输出、环境和规划目录不纳入。
README已明确两条入口及生产启用条件;发布验证和结果见任务记录。上传代码不等于生产部署,不启动新取数或重启当前服务。
本次发布前回归:146项Python(含独立临时PostgreSQL全流程)及9项JS全部通过,无跳过;JS语法及文档检查通过。发布方式为提交本地main后普通推送到新远端arr0918的main,并回读核对提交;原origin保留。
## 2026-09-18 — 接口传参清单已整理,供用户确认
按用户请求新增[实际传参确认单](../../ARR_OHIP_REQUEST_PARAMETERS.md):8接口的方法/路径/参数/来源/补查条件、页面到任务参数及酒店路由边界。
实际调用请求构造函数生成8份虚构示例,无网络、凭据读取或业务任务。没有改代码、规则或配置。
关键待确认范围已显式列明:预订列表只传到店日期/分页/排序,没有显式预订状态/分房状态;Comments没有额外内部备注开关。未传条件不能据此认定平台默认返回全部状态或备注。
房间日历未传预订ID(本地关联),套餐结束日为离店日;查不到预订当前结束采集并提示异常,不生成空日报。
接口开发完成结论保留,查询覆盖和真实返回验收仍待确认;本轮不自行扩大查询或触发取数。
## 2026-09-18 — 自动取数开发收尾完成
用户要求收尾并询问生产能否完成自动取数和报表处理。已整理[生产交付说明](../../deploy/OHIP_RELEASE_HANDOVER.md),明确开发/模拟/交互已完成,生产配置与首日真实数据验收待执行。
核对发现基础Compose尚未传三个OHIP参数/挂载私有目录,019需在018之后升级,独立月报worker需持续运行;固定平台/应用身份、酒店路由校验和booking_test数据库边界保留。
正式环境未提供,不擅自修改这些边界或启动部署。已纠正入口文档旧服务名和架构文档“尚未衔接处理”的过期说明。
2项部署入口检查通过,CLI参数核对通过;处理器zip/skill各8个关键文件与源码一致。本机无Docker,本次未构建生产镜像。未新增取数、停止原任务、重启服务或操作生产。
本阶段关闭。后续为正式环境配置,然后在有数据且开始验收时核对字段和报表,不再反复要求当前无数据沙箱出报表。
## 2026-09-18 — 字段接口接入已完成,用户说明测试环境无数据
用户明确当前测试环境无数据,现阶段无法核对实际结果,重点是确认字段对应接口是否接入。
只读核对代码:15字段由8个查询操作覆盖,日期参数、页面按钮、直接处理/日报/复核/月报均已衔接;团队读取权限此前已补齐。
状态为“接入完成,待有数据后验收”。测试环境无数据是用户提供的条件,本轮未自行查询或判断全平台数据状态。
不把实际报表结果核对作为当前必须推进事项,不新增/重试现有任务,不主动恢复实际取数验证。
## 2026-09-18 — 用户确认日期选择交互通过
用户明确反馈“OK了交互方式没问题”,本次页面内日历、运行中预选日期的交互验收关闭。
保留现有交互,后续关注用户已发起任务的状态和日报/月报结果;不得把交互确认当作实际取数成功或新增取数授权。
本轮仅记录验收,无代码、服务、任务或业务数据变更。
## 2026-09-18 — 日期选择与正在进行的任务分离
用户截图确认红框日历因原9/15任务运行而禁用,现允许预选下一日期,轮询保留用户所选值;仅提交瞬间短暂禁用日期。
运行中下载按钮仍禁用;不明结果/中断任务继续核对原编号、日期,继续按钮注明原日期。预选不会自动下载、改原任务或停止原任务。
原8875实际点日历→9/17成功,后续页面更新仍为9/17、进度仍为9/15;点日期文字也可展开。验证后恢复原显示日期,准备展开日历供用户操作。
9项JS提交/恢复检查与27项Python回归通过。没有新增或重试取数、重启服务、修改业务数据或委派。
下方“任务运行时锁定日期”的旧交互已由本条取代,任务身份与提交保护仍保留。[证据](../50-evidence/topics/2026-09-18-arr-calendar-selection.md)
## 2026-09-18 — 日期选不中已改为页面内日历并实际点选验证
用户明确故障出现在下载前,上次仅扩大原生点击区未解决,已撤回该完成结论。ARR日期框现使用页面内日历,保留YYYY-MM-DD、原日期校验及任务锁定,补充运行中/继续原任务的锁定原因。
独立只读8877中实际点击9/15、跨月点击8/31均更新输入值;键盘跨月和英文Report date点选成功。27项Python及5项JS检查通过。原8875已刷新加载新控件。
复查时已有用户06:13:51Z发起的9/15任务,原request_id保持、attempts=1,仍在获取;修复没有创建/重试/停止任务或重启服务。运行中日期锁定是正常状态,结束后可用新日历。不要再把“弹层打开”或fill改值当作鼠标选日验收。见[证据](../50-evidence/topics/2026-09-18-arr-calendar-selection.md)。
## 2026-09-18 — 修复Download ARR日期框难以点击
用户反馈日期点不动;确认日期未禁用,但仅小日历图标能打开选择器。已把原生日历点击区域扩大到整个日期框,保留原图标、日期编辑和任务锁定。实际浏览器点击文字/中部均打开日历,修改值可以保留;23项Python及5项JS检查通过。已刷新8875并恢复原日期2026-09-17,未查询订单、创建任务或重启服务,所需权限仍齐全。见[证据](../50-evidence/topics/2026-09-18-arr-date-click.md)。
## 2026-09-18 — 团队读取权限已补齐,OHIP下载按钮已启用
用户通知同事已完成授权。06:00:56Z运行既有check-access,仅读取开发身份、应用与密钥状态,返回ready=true、无缺项。应用现有blocks.read/configuration.read/finance.read/hotel.read/profiles.read/reservations.read;原密钥有效。额外hotel.read、finance.read由平台同事配置,ARR未调用,也未修改平台授权。
浏览器原8875页面刷新后显示“可下载所选日期的报表”,下载并处理按钮已启用,旧缺权提示消失。未重启服务、点击下载或实际查询酒店;当前任务数0、source归档不存在。
本机入口已就绪,本轮权限阻碍关闭。继续遵守不主动实际取数的要求,由用户在页面选择日期并主动发起。后续不要直接apply旧需求清单,以免覆盖平台已有额外权限。
见[开通证据](../50-evidence/topics/2026-09-18-arr-ohip-activation.md)。本轮仅配置状态及记录更新,无业务代码变化,无需重复离线测试。
## 2026-09-18 — 本机OHIP沙箱入口配置完成,等待团队读取权限
用户授权配置连接后,本机8875已切换为OHIPSB02的OHIP数据来源,沿用原登录信息;新私有本机库/对象/队列,原模拟实例完整保留。页面已登录核对,人工XML入口保留;没有真实查询任务。
平台现有configuration.read、profiles.read、reservations.read,缺blocks.read;开发身份无法在保留configuration.read的同时apply完整权限,403 capability_ceiling_exceeded。未修改授权、删除旧权限或签发新密钥。
用户已转达同事,并表示加好后通知。当前下载按钮暂停并显示具体原因;其余本机配置完成。收到通知后执行local_ohip check-access,仅核对权限并恢复按钮,禁止顺带实际取数。
7项新增及相关回归共37项通过(含本机真实隔离数据库,无skip);实际启动/登录/页面验证通过,零酒店业务调用。
没有子智能体、远程业务库/OSS或8873/8874操作。新运行目录和恢复方式见[本轮证据](../50-evidence/topics/2026-09-18-arr-ohip-activation.md),[给平台的说明](../../integrations/ohip/PLATFORM_ACCESS_REQUEST.md)。
## 2026-09-18 — 用户确认交互验收通过
用户在本机8875登录恢复后确认“ok交互没问题”。记录为新增按日期获取入口的页面交互验收通过。
当前交付状态:15字段接口接入、直接数据处理、原规则复用、价格复核及日报/月报已完成开发和本机模拟验证;
使用说明及运行配置已整理。下一阶段为目标运行环境的配置与启用安排,不重复调整已确认的交互。
此确认不扩展为实际沙箱取数验证或正式上线批准;原“跳过实际取数验证”要求继续有效。
本轮仅更新项目记录,无代码、运行实例、业务数据或平台调用变化。
## 2026-09-18 — 本机8875登录连接恢复
用户看到Failed to fetch;确认8875无监听,Web进程已退出,原测试数据库仍运行。仅核对并停止本实例遗留的数据库进程,保留全部记录后恢复。入口现由用户会话launchd后台运行,标识com.arr.local-direct-data.8875,配置在实例service.plist;不依赖对话执行进程。后台需LC_ALL=C/LANG=C,否则本机PostgreSQL启动时报locale/thread错误;已配置。未安装系统或开机自动启动项。
核验:healthz200、使用现有login.json登录200、认证会话200;原任务仍succeeded,Oracle连接false。未新增业务任务、未重新取数、未操作8873/8874。未修改应用代码。
## 2026-09-18 — 接口数据已直接接入按钮、复核与报表
按用户“继续”完成直接数据处理:选日期→15字段查询→共用筛选/去重/定价→独立核对→日报、价格复核、Finance及月报。
不生成中间XML;原XML入口保留。新来源明确为source_data/ohip_json,结果5.0,处理器4.2.0;XML4.0及旧3.0兼容保留。
迁移019仅在独立本机库使用,正式启动会检查迁移;正常OHIP启动需显式三项配置,构造服务不实际取数。
最终137项整体验证(含12项新入口检查,其中4项真实独立本机数据库)及83项相关回归、5项JS检查全部通过。
浏览器真实点击成功:6笔模拟订单/总额18200、日报/月报下载、刷新和服务重启恢复、桌面/手机、人工上传可用。
新演示页8875运行中,登录信息在私有实例login.json;不连接Oracle。原8873/8874未重启或重置。
未实际查询酒店、读取平台凭据、扩大权限、上线,未创建子智能体。已从“待开发加工衔接”推进到本机可体验。
见[入口说明](../../arr_web/DIRECT_DATA_ENTRY.md)、[ADR-007](../10-decisions/ADR-007-direct-ohip-data.md)、
[验证与实例信息](../50-evidence/topics/2026-09-18-arr-direct-processing.md)。
接下来为用户体验反馈和明确环境启用;不自行恢复实际订单验证。
## 2026-09-18 — 15 字段取数入口已实现(无实际订单验证)
用户要求直接接接口、跳过实际取数验证。新增 `integrations/ohip/arr_data.py` / `data_client.py`,
按单日查询预订并补查所需公司、主客、日价、团队、房间历史和套餐,直接输出15字段JSON,不生成XML。
明确区分有值/空/缺失/多候选/失败;保留多值原文和响应出处;完成请求可固定复用,失败重试保留旧尝试。
41项新增本机检查及相关回归共150项通过,含loopback HTTP、6笔样本原有定价函数结果(总额18200)。
没有实际酒店请求、凭据读取、授权变更、数据库/OSS写入、子智能体或运行实例操作。
现有页面执行器仍走XML;当前已交付取数程序,下一步是直接数据处理及其校验/复核/入库衔接,再连接页面。
不再把下一步写为“先验证真实订单”,除非用户后续改变这条要求。
见[使用说明](../../integrations/ohip/DATA_SOURCE.md)和[实施证据](../50-evidence/topics/2026-09-18-arr-data-interface.md)。
## 2026-09-18 — 当前重点:按字段接通 OHIP 数据入口
用户明确保留人工 XML 上传,同时新增按所选日期查询 OHIP 数据、直接按相同业务规则处理的入口;
不再以取得或重建 XML 为前提。当前优先事项是按 `ARR_XML_RAW_FIELDS.md` 接通对应接口,
自动入口共 15 个业务字段,Trace 不获取。公开目录/接口说明实时核对为 0.11.0、184 项操作,
预订、日价、档案、房间历史、团队及套餐查询均已列出;这不代表本轮实际沙箱字段取数通过。
[逐字段对接表](../../ARR_OHIP_FIELD_MAPPING.md)记录现有取值、组合查询及待验证项。
本轮仅新增对应表与项目记录,无酒店业务调用、权限修改、代码或运行实例变更。
后续按字段验证和补齐取数,不把历史 XML 显示等价条件作为所有数据入口工作的前提。
本对话沟通约定:使用产品语言,每次沟通末尾说明下一步;默认独立完成。
只有预计大幅提升效率时才可征求子智能体许可,得到用户同意后原则上最多创建一个。
## 2026-09-18 — 本地模拟数据补充
用户正在评估通过业务接口取数后按 ARR 规则加工,并要求补造部分测试数据。已新增独立的
[`arr_api_synthetic`](../../tests/fixtures/arr_api_synthetic/README.md) 数据包:6 条正常样本、8 种异常场景。
现有加工函数已核对 6 条正常样本及 3 种异常;另 5 种仅有样本和预期要求,尚未验证接口接入实现。
这不代表 Oracle 接口、完整 Excel 链路或真实取数规则已通过。未写入 Oracle、OSS、数据库,未操作 8874。
下一步是离线验证接口数据接入加工层,再以测试酒店实际返回验证关联规则;不继续把模拟结果作为原生下载证据。
本条为新增离线数据的进展说明,下方历史核验记录保留。详见[核对范围](../50-evidence/topics/2026-09-18-arr-synthetic-business-data.md)。
## Current Focus
Room-type continuation: official Oracle ROOM_CATEGORY_LABEL definitions support the room-type code, and all139 captured
records agree at search/current/arrival-day levels. Added strict selection (fields/v3, preparation/v4),4 new/98 scoped
checks and independent139-row comparison pass. Other candidate fields and oldfacts are byte/structure unchanged.
No dictionary query needed. Package22 records/30 items include8 multi-package records; all60 schedule dates coincide,
so timing/combination rules remain unproved. Search24 Group names match exact Profile IDs in detail; no missed company
or travel-agent role was found. No hotel requests/agents/8874 changes. No user reconfirmation needed for this authorized
technical work. See [room/package/company evidence](../50-evidence/topics/2026-09-17-arr-room-type-and-package-scope.md).
Existing-source correction:26 of139 RSV records already carry typed `BlockCode` alongside the separate Block ID.
Search/arrival-day identities and codes all agree (4 blocks);113 missing block objects remain explicit gaps.
`source_fields/v2` and preparation/v3 now select those codes, with9 new/94 scoped tests and independent139-row offline
comparison passing. Old field-facts bytes/native XML/851-file archive unchanged. No getBlock calls or permission expansion
needed for these26. Real adapter/validator still pending; recording8874 untouched. See
[typed BlockCode evidence](../50-evidence/topics/2026-09-17-arr-typed-block-code.md).
User confirms the technical request has been sent to platform developers. Await their diagnostic/evidence reply;
do not ask for another forwarding or infer the agent sent it. Independent button/local simulation work and identified
backend fixes are complete. Remaining actual-source mapping/integration depends on those specific inputs. Keep8874
unchanged; no repeated polling/audits or speculative code while evidence is unchanged. On a reply, assess which gaps
it closes, complete supported mappings and independently validate them in a separate instance.
User asked whether source evidence needs manual confirmation, then continued the responsibility triage. Clarified:
no new user business decision is currently pending; existing date/GEN/Trace choices stand. ARR owns mapping, independent
validation and integration; platform/test-environment owners supply diagnostic results and applicable same-source
evidence. Prepared the [technical request](../../integrations/ohip/arr-platform-evidence-request.md) with existing
request IDs and closure criteria; [source handoff](../../integrations/ohip/real-source-handoff.md) now separates owners.
No new hotel/public-network calls, code/tests, agents, messages or recording-instance changes in this clarification.
Next obtain specific evidence, resolve mappings and verify separately; no per-download source-confirmation step added.
Fixed a real PostgreSQL/Web failure-receipt mismatch found during source handoff review: rejected audit IDs were
misread as invalid Finance success evidence, leaving definite failures interrupted/retryable. Receipt conversion now
accepts the rejection ID with null version number;46 scoped tests including9 real disposable SQL cases pass.
No live8874 change/restart or new hotel call. Interface task has returned a dependency handoff, not a real adapter;
next requires sufficient source/report evidence before isolated actual-source integration. See
[failure-receipt evidence](../50-evidence/topics/2026-09-17-arr-rejected-receipt.md).
Real-source task handoff audit: current public catalog remains0.9/158;getBlock/getRoomTypeInfo/getPackage definitions
are published.4 public reads/0hotel requests. Real adapter and independent mapping validator are still not delivered:
name/historical-room/company/report inclusion-order semantics lack sufficient evidence; no guessed blanks, mock imports
or always-refusing placeholder added. The fixed139-row sandbox batch also has115non-whitelist/24missingrate codes,
so it cannot be a successfulFinance positive even after mapping completion. Minimal external dependency and component
restart boundary are in [real-source handoff](../../integrations/ohip/real-source-handoff.md). No code or8874 recording
instance changes; user must not be told actualARR is ready. See [audit evidence](../50-evidence/topics/2026-09-17-arr-real-source-delivery-gap.md).
User reconfirmed interaction acceptance and continued backend work. Explicit standard-Web source assembly is now
implemented with shared upload processing dependencies, pinned pre-dispatch source identity and orderly queue/storage
shutdown. Local owner shutdown race reproduced and fixed.91 distinct scoped tests pass, including3 owned SQL cases;
default CLI remains source-unconfigured. Source task has no new real adapter/validator delivery. No changes to the
running recording page/data, hotel calls, deployment or agents. Next actual-source mapping/independent acceptance,
then explicit source injection and bounded real-data integration. See [runtime evidence](../50-evidence/topics/2026-09-17-arr-download-runtime.md).
User accepted the ARR button interaction and requested a clean customer recording start. Local8874 was cleared with
a recoverable cold backup:6 prior tasks/6 daily/432 records/6 monthly are archived, current queue/SQL histories now0.
Same source fixture/date9/15 and login credentials; service ready, browser authenticated on empty daily page.
Do not submit another test before the user records. See [cleanup evidence](../50-evidence/topics/2026-09-17-arr-recording-cleanup.md).
Earlier integration counts below describe completed historical acceptance, not current live records.
The existing ARR card is now browser-integrated against local API8874: unavailable-date lock reproduced/fixed,
then9/15 double-click→one new152-call capture→61 retained→daily/monthly downloads. Reload and same-request replay
keep the same job. SQL totals changed from1 to2 versions/events/monthlies and72 to144 records, preserving the earlier
run; all61 new monthly formulas verified.5 new JS and34 regression tests pass. No subagents, Oracle calls or production
changes. The working page remains open. Next: user acceptance of this local button flow, followed by actual-source
mapping/acceptance when available. See [button integration evidence](../50-evidence/topics/2026-09-17-arr-button-api-integration.md).
Local API simulation is now separately usable at127.0.0.1:8874 (sidebar logged in). XML-derived72-row fixture →
152 actual loopback HTTP calls → generated processingXML/native comparison →61retained/11excluded → one isolatedSQL
version/event/monthly. Daily cells match native replay except user-excludedTraces; monthly61formulas pass. Restart
preserves results.91 scoped tests and real browser desktop/mobile/download/restart pass. No platform calls/agents or
booking/production changes. Native replay8873 remains available. Local full-flow/button milestone explicitly notified;
actual Oracle fullARR acceptance remains pending. Initial one-run acceptance is preserved below; the subsequent
button integration above adds one explicit fresh run while keeping Oracle source semantics acceptance separate.
See [API simulation evidence](../50-evidence/topics/2026-09-17-arr-local-api-simulation.md) and
[button/operator guide](../../arr_web/LOCAL_API_SIMULATION.md).
Isolated native XML replay is now usable at127.0.0.1:8873, sidebar browser logged in. Exact72-row9/15 XML processed
with current policy into61 retained/11 excluded; actual SQL confirms one version/event/monthly run; downloads and61
monthly formulas verified. Restart preserves same results.9 new+75 related tests pass, browser desktop/mobile passes.
Explicit local banner/cookie/filename prefix and separate owned private socket-only PostgreSQL/objects. No hotel calls,
agents, production settings or booking simulator changes. This is the local button milestone, not complete API ARR.
See [replay evidence](../50-evidence/topics/2026-09-17-arr-local-xml-replay.md) and [entry guide](../../arr_web/LOCAL_XML_REPLAY.md).
User clarified the booking project's current business execution is a local simulated hotel, not Oracle sandbox.
Read-only CP31/CP33 docs confirm that distinction and warn its in-process hotel state is lost if rebuilt. Recommend an
isolated ARR local instance for native XML replay and separately labelled API simulation; do not reset/share the active
booking instance implicitly. At that clarification checkpoint no import had occurred; the later replay result is above.
Earlier ARR platform captures remain separate evidence.
See [shared-hotel context](../50-evidence/topics/2026-09-16-shared-hotel-rsvn-context.md).
The ARR platform live-read target isOHIPSB02 sandbox. Calendar200 withoutroom is a data/coverage unknown,
not a diagnosed platform defect; do not frame platform repair as a prerequisite for every remaining development task.
Separate callable-contract, sample-coverage and real-report acceptance. Continue local/sandbox-contract integration where
possible;57106 XML cannot demand matching sandbox records.503 remains a real call failure. No readiness flags changed.
Authoritative boundary: [source contract](../40-domain/arr-source-report-contract.md#当前沙箱与验收边界).
Room/calendar continuation:13 new/71 scoped tests pass for bound single-page evidence, exact reservation/hotel joins,
all room occurrences/moves, original time zones and missing-vs-empty distinction. Existing3 responses still omitroom;
851 main files/17 probe files/nativeXML verify unchanged. Native72 ROOM_NO=DISP_ROOM_NO;10 CKOT also equalLAST_ROOM,
so fallback/selection rule remains unproved. Official pinned Postman example has reversed dates/no responses and does
not verify assignment defaults. No new hotel/credential/delegation/runtime actions. See
[room evidence](../50-evidence/topics/2026-09-17-arr-room-calendar-evidence.md). Need actual room-bearing responses plus
same-source semantics; completeARR/button milestone pending. Do not retry solely on elapsed time.
ARR name dependency correction: completev2 main captures are independent ofsearchProfiles. Added separately pinned
profile supplements, bounded failure/deferred gaps, chain-verified reuse of good names and retry of only missing profiles.
Connected optional supplements to local candidate preparation; oldv3/replay and default runtime stay unchanged.
131 scoped tests pass,12 new.139-row/851-file base,72 failedv3 files,14 earlier probe files and nativeXML verify unchanged.
No hotel calls/credentials/delegation. Direct display-name formatting remains sample evidence, not report acceptance.
See [decoupling evidence](../50-evidence/topics/2026-09-17-arr-profile-decoupling.md).
Next: use repaired/new evidence for bounded name/room checks and source acceptance; completeARR/button notice pending.
Local XML-upload improvement completed: processor4.1.0 ignores recognized emoji in text and narrowly recovers CESU-8 emoji while retaining original source bytes/hashes. Original71052877 now passes with4 ignored/67 retained;71052708 remains100.122 distinct Python/3 JS checks verified, including independent replay and frozen legacy behavior. Not deployed to the remote ARR runtime. See [emoji cleanup evidence](../50-evidence/topics/2026-09-17-xml-emoji-cleanup.md).
Latest reported-repair verification: catalog0.9.0/158(+43), getRoomCalendar now published under existing read permission.
Six business reads/own audits: original failed profile still503/25004ms;3 calendar200 responses are metadata-only with
no room/page/hotel totals;2 exact zero-night CheckedOut summaries match identities/dates but still lackroomId/shared=false.
No full-day restart, permission/key/runtime/production change. User explicitly approved1 read-only catalog reviewer under
new ask-first/normally-one policy for today.851+72 old files/native XML unchanged;21 new probe files privately verified.
[Current evidence](../50-evidence/topics/2026-09-17-arr-platform-recovery-recheck.md) and [platform request IDs](../../integrations/ohip/platform-recovery-check-20260917.md).
Next upstream failure/empty-calendar diagnosis; completeARR/source acceptance and button milestone remain pending.
Overnight continuation: delivery now checks the caller's complete capture binding/current policy before destination
writes; shared job and package identities reject numeric JSON type aliases. Executor collection/page limits are explicit,
validated and frozen.112 distinct scoped tests pass:38 batch,65 executor/handoff,2 package/recovery and7 real isolated PostgreSQL scenarios. v3 lost-COMMIT recovery makes no new profile reads and keeps one version/outbox event. No hotel,
network, credentials, production writes/runtime activation or subagents. See
[delivery and bounds evidence](../50-evidence/topics/2026-09-17-arr-delivery-context-and-bounds.md).
Remaining work needs profile recovery, reservation-bound historical rooms and same-source report semantics; it is not
only503. No new request for user materials. Full actual ARR/button milestone remains pending.
User requests all work independent of503 without repeated questions; no subagents. Completed integrated16-field source
preparation and opt-in v3 executor/profilebudget with typed immutable request identity.237 scoped tests pass (212 source,
25 executor). Real139 records retained:139 confirmations/dates/counts/notes,115 codes,73 agreed rooms,134 rates;
allrows keep unresolved display gaps.851+72 original files/native XML unchanged. Only2 public catalog reads, no hotel
calls/credentials or production/runtime activation. Catalog115ops/getRoomCalendar404 unchanged. See
[offline preparation/v3 executor](../50-evidence/topics/2026-09-17-arr-offline-preparation-and-v3-executor.md).
Next external repair/historical-room/same-source evidence, then accepted mapping and runtime wiring. The local candidate
preparer is not an adapter/independent business validator; completeARR/button milestone remains pending.
Latest independent work connects completev3 name captures to versioned field evidence and native comparison.19 new
cases/198 scoped tests pass; verifier independently derives raw Primary Profile joins and successful request provenance.
Missing query/field/blank stay distinct; exact and trimmed display names are separate observations. Replay rejects
JSON boolean/number aliases. Old139-row evidence is byte-identical;851 old and72 failedv3 files/native XML unchanged.
Five real names support primitive checks only; failedv3 remains rejected and no full ARR was produced. User has shared
503 diagnostic with platform. No new API/credential/Finance/runtime activity or subagents this round. See
[named evidence](../50-evidence/topics/2026-09-17-arr-named-field-evidence.md). Continue independently under the latest
no-subagents instruction; next recovery evidence/bounded acquisition and remaining historical-room/source acceptance.
Latest user“继续”authorized the concrete one-batch scope (139 reservations/112 profiles, OHIPSB02/2026-09-15).
The v3 live attempt stopped after23 requests:19 HTTP200/4 profile503, all matched own-app audits.139 search candidates,
6 successful details/rates,5 valid names; the6th primary profile exhausted3 attempts. Another profile recovered503→200.
Errors are auditedohip_unavailable/~25s/internal retry2, not a proved root cause.72 new private capture files verify;
complete-archive reader rejects this failed batch. No new whole attempt, delegate, code/grant/runtime or Finance write.
See [live failure](../50-evidence/topics/2026-09-16-arr-named-day-live-failure.md) and refreshed
[platform diagnostic](../../integrations/ohip/profile-summary-platform-check.md). User has since shared it; the agent has not sent it.
Bounded v3 name capture/replay/batch reuse retains the217-test local baseline. Original3 real responses pass offline;
139 old reservations contain112 profiles,851 originals/native XML unchanged. Next platform503 diagnosis/repaired full-day
acquisition and source acceptance; completeARR/button milestone pending. Latest2026-09-17 user instruction prohibits
subagents for subsequent work, superseding the earlier one-agent preference. Continue independently.
Earlier user-authorized22:21 profilePOST recheck succeeded for all3 original people: HTTP200, audit agreement, matching
Profile IDs/Primary name components and nonblankfullName. nameType is absent; GET not retested.503 was then considered
recovered for those samples; the later full-day failure above reopens platform investigation. See [recovery success](../50-evidence/topics/2026-09-16-arr-profile-recovery-success.md).
Independent work also fixed freeze-before-ready recovery with a durable pre-rename intent pin; full byte/context checks
precede ready repair, old unpinned packages stay rejected, completed legacy packages work. Added early cumulative archive
budget checks and bounded failure finalization.164 distinct scoped tests pass;139 records replay offline/851 originals
and native XML unchanged. Two newly authorized read-only reviews completed; no concurrent Web code/runtime changes.
Room-calendar public catalog recheck remains404. Next bounded name-collection integration and historical-room/source
acceptance; completeARR/button milestone pending. See [freeze recovery](../50-evidence/topics/2026-09-16-arr-freeze-recovery.md)
and [acquisition budget](../50-evidence/topics/2026-09-16-arr-acquisition-budget.md).
Earlier21:55 profile recovery recheck: user reported503 might be fixed; one exact-ID POST for the first of the previously
approved3 people still returned503/ohip_unavailable at2026-09-16 21:55 Asia/Shanghai. Edge audit confirms25009ms and
internal retry_count2; client made1 attempt with40s deadline and received the error in26.93s. Stopped before other2/GET.
851 capture files/native XML unchanged; no code/permission/runtime change or full ARR output. Next platform investigation
should use request ID`acea6692-25d7-4711-bcb6-3cd5916e3f5c`, then recheck the same sample upon new recovery evidence.
See [recovery evidence](../50-evidence/topics/2026-09-16-arr-profile-recovery-recheck.md).
Previous continuation consolidated the [minimal platform handoff](../../integrations/ohip/arr-platform-next-actions.md):
repair profile-summary503 (user says not repaired/unknown), and verify reservation-bound historical rooms for2 captured
CheckedOut zero-night/non-pseudo records lacking room values. Native10 CKOT rows retain display/last room, but are another
hotel, not paired proof. Suggest getRoomCalendar read/equivalent; company display needs same-source evidence, not another
blind API addition. No hotel retry/code/delegation;851 capture files/native XML unchanged, complete ARR still pending.
See [follow-up evidence](../50-evidence/topics/2026-09-16-arr-minimum-platform-followup.md).
Room/profile source agreement is implemented: matching reservation/hotel/day before three explicit room values,
and caller-selected role/internal Profile ID/raw-name agreement across reservation/day layers.10 new/133 tests pass;
139 offline rows give73 room agreements and24 Group agreements despite external-ID differences.1 current/search-only
room and65 missing all room fields remain distinct; company absence is not inferred from missing association containers.
851 originals unchanged. Public catalog getRoomCalendar exact lookup404; Oracle schema offers room-history/segments
as a candidate to assess, not a proven required extension. No hotel calls/delegation/Web activation or complete ARR.
See [room/profile evidence](../50-evidence/topics/2026-09-16-arr-room-profile-selection.md).
Source selectors now also preserve all exact GEN/RESERVATION text, select equal explicit stay/day adult/child counts,
and expose arrival-day raw numberOfUnits without asserting report share semantics.10 new/123 scoped tests pass;
139 real offline records agree with the independent comparator,851 originals unchanged.29 records contain30 GEN notes,
including3 internal;1 multi-note record is order-sensitive for first note/Group Code. No report-order inference or
whole-batch business gate added. No new hotel calls, delegation, Web change or complete ARR output. Next narrow company
and room source rules while profile summaries await recovery. See [note/count evidence](../50-evidence/topics/2026-09-16-arr-note-count-selection.md).
Direct source selectors now implement typed confirmation, explicit stay dates, strictly single-day rate codes, bound
raw Decimal rate/currency and empty Trace.12 new/91 scoped tests passed;139 pinned rows yield139 confirmations/dates,
115 codes (24 missing),134 prices (3 hidden/2 missing currency);851 originals unchanged. No XML/source acceptance.
User approved profiles.read and at-most3 primary guests. Acknowledge/validate/apply/read-back completed on the same
application and original key, preserving reservations.read. The single-profile summary helper has9 new/100 scoped tests.
Three POSTs and one same-person GET control all failed with audited503/ohip_unavailable after~25s; no name data verified.
Private originals/inventory and851 earlier files unchanged. No more approval needed for this permission; platform
endpoint recovery and later verification remain. No automatic monitor/retry, fourth guest, Finance or Web activation.
See [probe evidence](../50-evidence/topics/2026-09-16-arr-profile-summary-probe.md) and
[platform diagnostic handoff](../../integrations/ohip/profile-summary-platform-check.md).
User now explicitly says Trace is not needed. API-source output should supply an empty Trace list; Trace filter/order
acceptance is removed from the remaining blockers. Manual XML/history/generic serializer remain unchanged. Sort choice
was not supplied; the native72-row sample has no room/date duplicates, so do not keep asking the user about unfamiliar
settings. Offline capture coverage:115 present non-whitelist rate codes,24 missing,0 matching the hotel's unchanged rules;
851 files intact. No additional material requested now. See [triage](../50-evidence/topics/2026-09-16-arr-input-gap-triage.md).
User requests a separate notification once complete ARR data can be produced for button integration. This milestone is
pending and tracked in commitments; do not confuse candidate or synthetic output with complete API ARR.
Explicit-row XML serialization and independent structural/value verification are now implemented, matching the existing
25MiB handoff limit.13 new tests and37 related cases pass across scoped runs. Native72-row projection retains58 notes/31
traces and produces identical processing semantics (61 retained/11 excluded); originals/baseline unchanged. Accepted API
row/field mapping is still missing; no Web/runtime/Finance enablement. See
[output evidence](../50-evidence/topics/2026-09-16-arr-xml-output-boundary.md).
Offline source-field evidence is implemented for all139 pinned v2 records:16 target columns plus raw context, exact
types/Decimal values, missing/null/empty/multiple observations and original response/request provenance. A separate verifier
independently enumerates raw sources and paths;16 new/140 scoped tests pass.851 original files remain unchanged.
This is the foundation of source adaptation, not an accepted XML adapter/validator or Web runtime dependency; all business
readiness flags remain false. Resv.-GEN confirmation remains closed. Two explicitly authorized read-only reviewers completed
their checks; concurrent Web/PG code was untouched. See [evidence](../50-evidence/topics/2026-09-16-arr-source-field-evidence.md).
Download readiness now recovers from initial connection failure or service unavailability without a page reload. GET-only
checks preserve the selected date and saved request, coalesce, pause when hidden and resume on online/visibility events.
9 browser interaction tests and34 existing Web/auth/layout tests pass. No styling/source/runtime activation change; see
[reconnection evidence](../50-evidence/topics/2026-09-16-arr-download-reconnection.md).
Real PostgreSQL15.19 transaction acceptance now passes6 isolated cases: actual executor commit, concurrent exact delivery,
connection loss after COMMIT/restart replay, atomic rollback, manual-review completion and monthly/outbox replay uniqueness.
The private Unix-socket cluster used current008–018 schema and synthetic source/local objects, then was stopped and removed.
This does not enable real API sources/runtime. See [PostgreSQL acceptance](../50-evidence/topics/2026-09-16-arr-postgres-download-acceptance.md).
Explicit-date `CapturedARRExecutor` now connects v2 capture/replay, injected adaptation/independent mapping validation and
frozen processing.10 new synthetic orchestration tests pass, including checkpoints before delivery and recovery without
recapture after lost commit acknowledgement. No real source adapter/validator is supplied and no runtime is enabled.
See [executor evidence](../50-evidence/topics/2026-09-16-arr-web-capture-executor.md).
User accepted the card styling. Added strict frozen-delivery-to-Web outcome conversion and seven synthetic cross-module
tests;62 scoped tests pass, including lost-ack restart/replay and manual-review completion without recapture. Source mapping
and real execution remain unwired; this does not enable the download button. See
[Web handoff evidence](../50-evidence/topics/2026-09-16-arr-web-frozen-handoff.md).
Local UI preview entry was repaired on2026-09-16 after the raw `file://` HTML failed to load `/assets` and `/api`.
Run `.venv/bin/python -m arr_web.preview` and open `http://127.0.0.1:8872/`; this separate loopback-only runtime has
an explicit read-only banner, empty history and unavailable business services. The HTTP page was opened and visually
verified in the in-app browser;13 preview/auth/server tests pass. Production authentication and runtime are unchanged.
The single-day Web download card and durable task boundary are now implemented locally; the real executor remains
unwired/unavailable. See [card evidence](../50-evidence/topics/2026-09-16-arr-download-card.md) and
[executor handoff](../../arr_web/ARR_DOWNLOAD_HANDOFF.md).77 focused tests and10 synthetic browser checks pass;15 final
locale/viewport layouts pass. The UI suggests yesterday but submits an explicit selected date; the collector receives
equal fixed dates and never infers a missing date. No hotel/Finance/OSS call, deployment or delegation occurred here.
ARR2.0 owns the deterministic XML-to-Finance path and the complete post-commit monthly publication path. The user
uploads XML once. After an accepted Finance commit, a dedicated worker consumes the durable outbox event, derives the
month and “更新至” watermark from committed `ARRIVAL` facts, publishes a validated workbook, and records a durable
download identity.
The company-channel detail generator now separates generation permission from calendar completeness: a current-month
or historical C/O period can be generated from the current committed Finance snapshot, while future report months stay
blocked. A not-yet-ended period keeps its fixed C/O cutoff and must be rerun after later source facts arrive if the final
workbook needs those facts. Duplicate publication of the same semantic snapshot is idempotent: the first validated
archive/result pair remains authoritative even if a retry rebuilds different XLSX bytes.
Monthly and company-channel XLSX generation is now Web/container deployable with Python/openpyxl only. The monthly
builder preserves sheet/header/row/formula/semantic validation, including `=R[row]*C[row]*G[row]`; the company builder
preserves its no-formula contract. Both publishers upload new workbook and `result.json` objects through the existing
immutable OSS adapter, while download routing retains controlled-local compatibility for historical records and keeps
`.web-jobs` queue state local.
## Accurate Native XML And Note Selection Confirmed On 2026-09-16
- User supplied res_detail_71054429.XML, explicitly accurate with page Note Types=Resv.-GEN. It is byte-identical to
res_detail_71050118.XML:354839bytes, SHA2565c87ab6f2483b2244e98e47bb792080ef4aca9036568638842116b246ac97438.
- XML lines91/93 contain RES_COMMENT_TYPE=CAS and RES_COMMENT_DESCRIPTION=GENERAL;58 notes share these metadata values.
These are internal XML fields, not evidence the user selected a different page option. Earlier wording implied a
business-selection discrepancy without sufficient basis; corrected. Baseline and page-selection confirmation is closed.
- Existing72-row/61-retained processing baseline remains applicable to the same bytes; no unnecessary rerun, business
submission or runtime change. Same-hotel/date API equivalence remains separate, as API is OHIPSB02 and native file57106.
- Next continue mapping the confirmed Resv.-GEN requirement to API data; do not ask again or replace it with CAS/all notes.
[Exact evidence and lines](../50-evidence/topics/2026-09-16-confirmed-native-arr-notes.md).
## ARR Display Contract Follow-Up On 2026-09-16
- Extended source comparison to42 independent hypotheses with company display prefixes and rate-day guest-count layers;
native-only privacy-safe summaries can run without a comparable API pair.40 tool tests/87 scoped tests pass.
- Native57106 XML:65 T-prefix company names,6 C-prefix,1 blank;71 names contain commas; room text ascends but all72 ROWNUMs
differ from physical position.58 notes are CAS/GENERAL, with no export parameter block. None proves role priority or sort settings.
- API139 reservations have equal valid stay/day adults and children;851 files and native XML remain unchanged. No hotel
call, business write, runtime change or delegation. Catalog0.7 public read confirms published rate operation; stale wait text removed.
- Earlier text clarification is now resolved by the accurate new filename and explicit Resv.-GEN confirmation above.
Internal CAS/GENERAL metadata does not change the user's page selection or authorize a different API note scope.
- Next source adapter still requires the accepted role/display/note/order/scope contract and independent mapping checks.
[Evidence](../50-evidence/topics/2026-09-16-arr-display-contract.md), [safe aggregate](../../integrations/ohip/arr-display-contract-20260916.json).
## API / Native Source Comparison On 2026-09-16
- User cannot currently access OHIPSB02 Opera for the matching native export. Do not ask repeatedly or treat hotel57106
XML as same-source acceptance. No new UI automation, hotel call or business write was performed in this continuation.
- Offline pinned v2/XML comparator is complete:32 independent field/format/role/scope observations, unique internal-ID
pairing, duplicate/only-in-one-source/order checks and bounded privacy-safe diagnostics. All readiness flags remain false.
- 32 new tests plus47 related regressions pass. Actual139-record OHIPSB02 capture versus72-row57106 XML correctly returns
not_comparable;851 original files and manual XML are unchanged. Source equivalence remains unverified.
- Official Cloud evidence excludes resolved/completed Trace and InSession GDS; neither proves other status/order rules.
Existing12 API Trace records have empty resolveInfo, so resolved exclusion is not covered. Company, display name,
report order/granularity and GEN mapping remain pending. Two explicitly permitted read-only agents completed their reviews.
- Next: continue evidence-backed source contract work; perform paired acceptance when same-environment input becomes
available, then versioned adaptation and executor/Finance integration. [Evidence](../50-evidence/topics/2026-09-16-arr-source-comparison.md).
## Complete Search/Detail/Day-Rate Capture On 2026-09-16
- User supplies From/To/rate date all2026-09-15. New v2 collector/replay/local batch entry accepts and freezes all three
explicit equal dates; shared v1 state/lock/retry behavior is preserved. Source adaptation and real Web executor remain unwired.
- 29 new tests,167 distinct relevant tests passed across the scoped runs. Catalog0.7 manifest now declares three reads,
acknowledges existing group-implied GET and passes plan/validate; no apply/grant/key changes.
- OHIPSB02/day2026-09-15:139 details and139 rate responses, both full search passes equal.283 transport attempts comprise
282 HTTP200 and1 recovered transport failure.134 valid amount/currency candidates (59 explicit zeros), allUSD;
3 InHouse rates suppressed and2 NoShow details lack base currency. Candidate capture complete, all_rates_valid=false.
- 851 private files pass hashes/protocol replay. Offline v2 batch replays283 stored attempts once and reuses the same pin
with0 new response reads on retry;851 current and432 v1 original files remain unchanged. No Finance/Oracle/OSS writes.
- Next: same-source field/range/order acceptance and source adapter, then connect the Web executor using stable capture/
frozen-package/Finance identity. Current missing names/company/rate codes and5 price diagnostics are not silently dropped.
[Evidence and pins](../50-evidence/topics/2026-09-16-arr-day-capture.md), [aggregate](../../integrations/ohip/arr-day-verification-20260916.json).
## System-Supplied Report Dates — User Clarification On 2026-09-16
- From Date / To Date are supplied by the upstream system; its current rule is T-1/T-1. ARR validates and freezes the
supplied dates, rather than calculating yesterday from a local clock/timezone or Opera business date. Current single-day
scope requires both dates to be valid and equal; search bounds and rate detailDate use that same day throughout retries.
- v1 collector/batch CLI require explicit arrival_date; new v2 accepts from_date/to_date/rate_date explicitly and checks
equality. No collector computes T-1. Web sends equal Python dates; accepted runtime executor wiring remains pending.
- Updated the [authoritative source contract](../40-domain/arr-source-report-contract.md), replacing the earlier provisional
ARR-side Asia/Bangkok date calculation. This clarification does not create a scheduler or alter existing evidence dates.
## Rate-Info Publication Verified On 2026-09-16
- User notification arrived; the earlier wait is satisfied. Edge catalog0.7.0/115 operations publishes recommended
POST searchRateInfo and deprecated GET getRateInfo under existing reservations.read; no grants/keys/apply were changed.
- Added separate [rate lookup primitive](../../integrations/ohip/rate_info.py) and contract excerpt.18 new tests plus99
existing acquisition/audit/XML tests pass (117 total). Minimal id/type/summaryInfo=false/detailDate request is sufficient
for the sampled test reservations; no repricing/currency override fields were sent.
- OHIPSB02,2026-09-15:5 distinct existing reservations (cross-day, package, zero, zero-night, ordinary),11 HTTP200 read calls,
all5 effective-price candidates valid in USD, first GET/POST equal. Package sample differs from base and matches total;
this remains a sample observation, not a replacement arithmetic rule. Raw37 files private and hash verified.
- POST lookup has since been integrated into v2 whole-day capture above; next complete source mapping/same-source report
acceptance. v1 archives remain search/detail-only. No Finance source adapter or production connection yet. See
[publication evidence](../50-evidence/topics/2026-09-16-rate-info-publication.md).
## Frozen Processing Handoff On 2026-09-16
- Added an isolated [frozen XML handoff library](../../integrations/ohip/processing_handoff.py), with21 new and131 related passing tests:
stable per-batch task identity, local processor/independent validation, immutable source/output/envelope preparation,
same-package upload/registration/commit retry, and recovery from lost acknowledgements without marking an uncertain commit failed.
- Tests use synthetic XML, filesystem objects and an in-memory repository; PostgreSQL exact-replay control flow also passes
with a simulated cursor. No live database, OSS, hotel/platform calls, deployment, grants or new delegation.
- This is preparation for an eventual accepted source adapter. It does not create XML from API data or prove source mapping;
source_mapping_verified remains false. Production wiring, authoritative package retention and real PostgreSQL concurrent/
disconnect/outbox acceptance remain open. Existing manual upload and price review are unchanged.
- The then-pending getRateInfo notification has since arrived; see the publication verification above. See
[handoff evidence](../50-evidence/topics/2026-09-16-arr-processing-handoff.md) and the existing field acceptance matrix.
## Retryable ARR Acquisition Batches On 2026-09-16
- User asked to progress non-price work while platform adds getRateInfo. Added isolated [capture-job utility](../../integrations/ohip/capture_job.py):
fixed batch identity/options, per-batch process lock, atomic private state, full-day fresh attempts after failure/interruption,
and completed-manifest verification/reuse before credentials or network are loaded. New ID explicitly requests fresh data.
- 20 new lifecycle/concurrency/crash tests and79 existing scoped checks pass (99 total). Offline139-record job first reads143
stored responses, second reads0 new responses and returns the same capture pin;432 original files unchanged. No hotel calls.
- This is local POSIX acquisition state only: no production distributed queue, scheduler, source adapter or Finance submission.
Existing manual XML submit still creates a fresh job. A later isolated frozen-handoff prototype above addresses retry
identity/unknown-result handling locally; production Finance integration/acceptance remains future work.
- No delegation used this turn; platform-ready notification remains with user. Details and resume boundary:
[batch evidence](../50-evidence/topics/2026-09-16-arr-capture-jobs.md), [run instructions](../../integrations/ohip/README.md).
## ARR Capture Readiness And Platform Handoff On 2026-09-16
- User coordinated platform getRateInfo addition and subsequently notified this task; the prior wait is now satisfied.
Two local read-only subagents were explicitly approved for this turn and completed processor/sample checks.
- Added a [manifest-pinned offline audit](../../integrations/ohip/audit_arr_capture.py) with raw-file integrity/protocol replay
and16-field candidate counts. Collector now returns its result-manifest digest.79 targeted tests pass;432 files/139
records verified without mutation or new hotel calls. No source conversion, deployment, grants or business writes.
- New concrete gaps: no complete displayed FULL_NAME despite unique primary-name components;396 rate segments all single-day,
so general date boundaries remain untested. Eight raw current-room collision groups can differ in rate/departure/notes.
Five zero-night records are valid; multi-room/shared-room scenarios are not covered.
- Confirmed validation precedes deduplication; later duplicate candidates cannot hide missing mandatory fields. XML replay
shares processor core functions and cannot by itself prove API-to-source mapping correctness. Existing rules unchanged.
- [Acceptance matrix](../../integrations/ohip/arr-api-acceptance-matrix.md) and
[readiness evidence](../50-evidence/topics/2026-09-16-arr-api-capture-readiness.md) specify resume steps once platform is ready.
Candidate availability is not value validity or report equivalence; Finance-ready flags remain false.
## ARR API Candidate Collector On 2026-09-16
- Added independent [read-only collector](../../integrations/ohip/collect_arr_source.py) for existing search/detail APIs:
explicit day/hotel, bounded pagination/retries, private original-response archive, identity/count/status checks,
explicit notes/Trace counts and complete search recheck. Partial, empty, drifting or warned batches fail closed.
- 34 collector tests and18 neighboring XML tests pass. Offline replay of139 details/four search pages preserves143 raw
responses exactly, with original477 files unchanged. No fresh hotel business calls, permissions, deployment or new delegation.
- Success means candidate acquisition only; Finance readiness, report equivalence and atomic snapshot flags remain false.
No source-format conversion, scheduler or integration with XML intake/Finance/OSS exists in this utility.
- Public catalog refreshed:0.6.0/111; getRateInfo/searchRateInfo still absent. Next resolve the actual platform rate-info
wrapper and same-environment price/report semantics before source adaptation and runtime integration. See
[collector evidence](../50-evidence/topics/2026-09-16-arr-api-collector.md) and [run instructions](../../integrations/ohip/README.md).
## End-To-End Readiness Audit On 2026-09-16
- Current source implements XML intake, immutable source replay, deterministic daily processing, manual-price review,
atomic Finance/outbox commit, independent monthly publication, Booking review/company reports, BI and authenticated
artifact downloads. The principal missing feature for the daily/monthly/BI path is automatic Opera source acquisition
and submission; native XML availability versus JSON adaptation remains unresolved.
- Automatic intake also needs complete-day delivery and task retry/deduplication semantics. Existing source/order/day
replacement rules remain authoritative. Manual price approval and Booking-source review/company generation are
existing operator steps, so source download alone does not make every product branch unattended.
- Compose starts Web/Caddy only; the implemented monthly worker must be supervised separately. Current production
deployment/restart behavior was not revalidated, and historical task failures are not current incident evidence.
Full local unittest regression: 401 total, 398 passed, 3 intentional private-fixture skips, zero failures/errors.
See the [audit evidence](../50-evidence/topics/2026-09-16-end-to-end-readiness-audit.md).
## Active ARR API Research Scope — User Correction On 2026-09-16
- The user explicitly corrected the Agent: Opera UI steps specify business criteria/data elements for platform API
discovery, not a browser-click implementation. Stop the Schedule Report/SFTP branch and UI/screenshot requests for it.
- XML is the supplied manual baseline and current processor input, not a user-imposed native-download-only API gate.
Study searchHotelReservations plus getReservation for equivalent ARR data, while keeping completeness, source replay,
price rules and existing validation intact. JSON adaptation is not yet approved or implemented.
- Both real operation definitions were re-read at07:07Z; they remain available under the existing reservations.read
grant. Only developer catalog reads were made. The subsequent mapping section records the delivered composition,
parameter/field mapping and concrete gaps. See [scope correction and mapping](../50-evidence/topics/2026-09-16-arr-api-scope-correction.md).
## ARR Rate-Info Endpoint And Semantic Follow-Up On 2026-09-16
- Found Oracle RSV getRateInfo/searchRateInfo: rateInfo.detail.totalRateAmount explicitly means the effective rate for
the specified reservation/date. Fresh catalog0.6.0/111 lacks both. Prepared a concrete [platform read-operation request](../../integrations/ohip/rate-info-platform-request.md)
and typed upstream examples; no Edge route invented, no grant/config changed, no external message sent.
- Saved-response analysis explains all9 search/base mismatches: search price matches the next-day2026-09-16 base.
All7 base/total mismatches equal that arrival day's computed package-price sum. This supports date-specific Oracle
rate info rather than guessed price reconstruction; report equivalence still needs validation.
- Company-role evidence is limited to Group (24 names across26 associations), so no new profiles.read need is proven.
Manual XML is in ascending room order with no duplicates; test API has8 duplicate nonblank-room groups/16 records.
Tie-breaking and report inclusion cannot be inferred from this cross-environment sample.
- This turn used saved139 records, the supplied XML and one public catalog read; no new hotel calls or delegation.
Next prerequisite for direct effective-price verification is the platform read wrapper, with parameters/tests in
[semantic evidence](../50-evidence/topics/2026-09-16-arr-api-semantics.md). Existing source/Finance controls remain intact.
## ARR API Read-Only Live Probe On 2026-09-16
- User continued the concrete proposal to test existing search/detail in known OHIPSB02. Isolated client made158 read
requests for arrival2026-09-15; allHTTP200 and expected envelopes. Two pages yield139 unique reservations; all139
details match identity/hotel/day. End recheck shows the same ordered IDs and no changed search records.
- Observed notes correct the official example:30 GEN/RESERVATION notes, including3 internal;32 total notes and12 Traces
match search indicator counts for every record. effectiveRate is absent in all139 details/396 rate entries, including
two focused fetch tests; search/base differ for9 candidate arrival rates and base/total differ for7. Do not default prices.
- Assignment filtering works with explicit paired booleans:74 assigned +65 unassigned form the exact baseline partition.
Single true flags alone did not narrow. ETA+07:00 returned0/warnings; local no-zone variants return12 and omit90 missing
and37 date-only values. These outcomes are current test evidence, not adopted production filtering rules.
- Raw sources are privately saved outside the repository with SHA-256 inventory. Repository includes only
[aggregate results](../../integrations/ohip/arr-api-probe-results-20260916.json) and [evidence](../50-evidence/topics/2026-09-16-arr-api-live-probe.md).
No new delegation, permissions/runtime/Oracle writes or Finance/Booking/OSS mutations. Research helper is isolated.
- Next: resolve report inclusion/empty-ETA behavior, actual effective-price and company-role mapping, and source ordering
using saved evidence; discuss optional Block access and source adaptation only after gaps are understood. Native XML
download, same-environment report equivalence and production end-to-end acceptance remain unproven.
## ARR API Field Mapping On 2026-09-16
- Completed a [concrete mapping](../../integrations/ohip/arr-api-mapping.md) of search/detail requests, all16 processor
source columns,3 derived outputs, pagination/completeness and source-adaptation boundaries. Five credential-free
examples passed offline targeted field/type/enum/date/query checks; no hotel business request was made.
- Key corrections: GEN is notificationLocation in the official RESERVATION comment example; effectiveRate includes
specified package additions and must be evaluated before using base; reservationBlock has no blockCode. These facts
narrow the test plan but do not establish hotel-specific report equivalence.
- The next proposed step was isolated read-only verification in known OHIPSB02 (subsequently completed above) of full date/status scope, pagination, detail completeness,
note selection, effective price, company role and ordering. Preserve raw responses and current pricing/replay/day
replacement controls. JSON adaptation and optional Block/profile/room-type grants remain undecided.
- The user now requires permission before each delegation. Exactly two read-only audits were started after explicit
permission in this turn; no nested or future delegation is covered. See [evidence](../50-evidence/topics/2026-09-16-arr-api-field-mapping.md).
## Historical Native XML Scheduled Delivery Investigation — Stopped After User Correction
- Re-read the complete live catalog and OpenAPI at06:42Z:0.6.0,111 catalog operations and152 total OpenAPI routes;
both data documents are identical to prior snapshots, with no report execution/download route.
- Oracle's official demonstration schedules Arrivals: Detailed; the standard-report guide supports XML and SFTP.
The user confirmed the scheduling entry is visible. Actual XML/SFTP options and an approved receiving location
were not confirmed. This investigation is stopped after the user's explicit API-scope correction; it is not an
adopted architecture or active prerequisite for API work.
- Prepared a [single-delivery trial draft](../../integrations/ohip/native-xml-delivery-trial.md), including fixed-day
validation, original-file comparison, destination prerequisites and the calendar-date/business-date mismatch.
A possible platform-owned receiver plus authenticated file API remains a proposal; no client/runtime/schedule,
destination configuration, external file delivery or permission change has been made.
## Native ARR XML Comparison Preparation On 2026-09-16
- Added an isolated read-only native XML comparator with a required pinned baseline SHA-256. It preserves physical
order, duplicate reservation occurrences and all note/Trace content, reports privacy-minimized counts/positions,
and refuses different hotel/group-date comparisons. It is not connected to ingestion, Finance or runtime.
- 18 synthetic tests passed; supplied manual XML versus its protected identical copy also passed for all72 rows.
This is a utility smoke test, not a downloaded-candidate comparison or business acceptance. Existing processor and
independent-validator results remain authoritative; GEN/CAS and source-environment evidence are still pending.
- Live catalog recheck at 06:26Z remains0.6.0/111 operations with no report operation. This tool can compare future native
XML files but is not a prerequisite for studying API-data composition under the later user correction. See
[comparison evidence](../50-evidence/topics/2026-09-16-native-arr-xml-comparison.md).
## Manual ARR XML Baseline On 2026-09-16
- User supplied res_detail_71050118.XML from Downloads: valid UTF-8 RES_DETAIL, one arrival group for 2026-09-15,
72 source rows, RESORT 57106 and THB. Processor 4.0.0 and its independent validator passed locally: 11 rate exclusions,
zero duplicates, 61 retained rooms, 125 room nights, all fixed prices matched, zero review issues. Source and outputs
are hash-checked in a private isolated Downloads directory; no Finance/Booking/OSS or runtime mutation occurred.
- Observed 58 notes coded CAS with description GENERAL; UI request remains Resv. - GEN until their relationship is
confirmed. XML has no internal-note marker. Asked the user for actual Note Types and source environment; screenshots
and export metadata remain unprovided. The sample includes 10 CKOT records, multiple Traces, nonmonotonic ROWNUM and
four starred arrival-time displays; preserve physical XML order and do not invent API semantics for these fields.
- This is a structural/processing baseline, not native API download or full parameter-equivalence acceptance. Current
OHIPSB02 and file hotel code57106 cannot be treated as one comparison dataset without verified environment binding.
See [sample evidence](../50-evidence/topics/2026-09-16-manual-arr-xml-baseline.md).
## Historical Native ARR Report API Review On 2026-09-16
- User offered to provide a manual export. Prepared a [minimal sample request](../../integrations/ohip/manual-export-sample-request.md):
one original XML for 2026-09-15, complete parameter screenshots, environment/hotel and export time. The XML has since
arrived and passed the local checks above; the screenshots and environment/export metadata remain pending. Interface
generation/download is still unverified.
- Fresh Edge catalog/OpenAPI readbacks remain 0.6.0 with 111 operations. No report metadata/parameter, native
res_detail execution or XML download operation is exposed. The current independent ARR application's read-only
reservation permissions were not changed.
- Reviewed all 45 public Property v1 specifications at Oracle commit dd631fbd5d0fce74a7dbdf96b43f07ce587211f2,
covering 3,580 operations. REPCFG provides getReports/getAllReports and getReportParameters metadata, but no
confirmed complete res_detail execution/download flow was found. This does not prove universal Oracle unavailability
or that an Edge wrapper alone can solve the gap. dateOffset is relative to business date, not calendar today.
- Prepared a concrete [platform handoff](../../integrations/ohip/arr-report-platform-handoff.md), not sent to others.
That native-file investigation depended on an execution/file-delivery contract, identity/parameters and comparable XML;
the later user correction restored broader platform API composition research. JSON reconstruction is not selected. No business call, real report
download, runtime, schedule or data mutation occurred. See [evidence](../50-evidence/topics/2026-09-16-native-arr-report-api-review.md).
## ARR Source Report Parameters Confirmed On 2026-09-16
- User supplied the actual Opera report workflow and options. The source is Arrivals: Detailed (`res_detail`), located
with Report Name ARR, for T-1 through T-1 and arrival time 00:00–23:59, with ALL Reservations/room assignments and
all seven code filters. Display Room Number and Notes, include internal notes, restrict Note Types to Resv. - GEN,
and download XML. Exact values are centralized in the [source contract](../40-domain/arr-source-report-contract.md).
- Source acquisition preserves ALL Rate Codes; the existing processor performs whitelist filtering after intake.
Calendar-yesterday does not silently become business-date-minus-one. API status/default/ETA/remark ordering equivalence
and native report generation/download remain technical verification work, not missing user button instructions.
- No report download, scheduling, application permission, processor, runtime or business-data mutation occurred.
## Same-Hotel Department Scope Confirmed On 2026-09-16
- The user clarified ARR is the Finance department's full report-acquisition/processing service, while the referenced
RSVN task serves the Reservation department of the same hotel. Restored the historical user confirmation: current
Oracle access is the standard test environment; after testing and Oracle approval, switch to the real hotel environment
using the same API contract with verified environment configuration.
- OHIPSB02 is therefore known test context, not an unanswered hotel-identity question. Reuse this background and prior
verified research without merging application credentials, copying Reservation write permissions or replacing the
current Booking Excel workflow. No sibling project, runtime, permission or business state was modified.
See [shared context evidence](../50-evidence/topics/2026-09-16-shared-hotel-rsvn-context.md).
## OHIP Application Provisioned On 2026-09-16
- The user supplied a new delegated credential. Installed CLI 0.5.0 authenticated as
`auto_219f3af6dc2123dc29ee3138` and created `Wyndham-ARR2.0-Codex` / `caller_zloxalzsQ9pYsztt` under the verified
human owner. Plan/validate/apply passed for `reservations.read` with search/detail and no implied extra operations.
- Issued one application Key through the CLI's protected file-delivery flow. Application readback confirms enabled=true
and one active key; local ready-file metadata, permissions and platform audit agree. All secret files are outside the
repository. See [integration setup](../../integrations/ohip/README.md) and
[provisioning evidence](../50-evidence/topics/2026-09-16-ohip-application-provisioning.md).
- The prior missing-management-credential blocker is resolved. Source download/JSON adaptation is still undecided and
unimplemented; no Oracle business request or ARR runtime/business mutation occurred. Management audits report
`hotel_id=OHIPSB02`, now confirmed from the related task and user clarification as the shared standard test environment.
## OHIP Integration Research On 2026-09-16
- Read the live Edge 0.6.0 catalog/OpenAPI (111 operations) and Oracle 26.3 reservation contracts against the current
programmatic ARR pipeline. The catalog exposes reservation JSON search/detail and async daily summary, but no
`RES_DETAIL` report-download operation. Search by arrival date plus detail with Comments/Traces is the leading
candidate for field-equivalence validation; no integration direction has been adopted or implemented.
- Preserve complete single-arrival-day replacement, deterministic first-row deduplication, source replay, manual-price
review and Finance/outbox boundaries. Incremental API data cannot directly replace a complete current-day version.
- Installed CLI 0.5.0 and the existing skill remain usable for public discovery. The official tools page requires an
authenticated console, while browser control timed out; new CLI/skill packages were not downloaded or installed.
A subsequent user-authorized login attempt returned HTTP 503 with “登录服务暂时不可用” on two attempts even though
`/healthz` returned 200/ok; no console session or package was obtained, and no login secrets were saved in project files.
Public contracts and a source/hash inventory were saved locally for discussion. No application, key, live Oracle
business call, ARR runtime or business-state mutation occurred. See the
[discussion memo](../50-evidence/topics/2026-09-16-ohip-interface-review.md).
- Historical task `01a08f5b-e9bf-7821-871a-6da7a088b806` subsequently confirmed a successful official CLI/skill download
and installation through the then-authenticated, functioning in-app browser. The installed CLI and all 3 skill files
are still present and usable; only the old download archive/directory is absent. Re-downloading is not a prerequisite
to continue integration research. No newer tooling release has been established, and no forced upgrade was requested.
- A later user-requested retry after a possible platform repair still returned console-login HTTP 503. The in-app tab
read timed out again, and the direct official bundle URL redirected to login HTML rather than a ZIP. No new tooling
artifact was downloaded; the installed CLI 0.5.0 and skill remain unchanged and available.
- The user then clarified that the installed CLI should create the ARR application directly. A fresh `automation whoami`
fails locally with missing `OHIP_EDGE_AUTOMATION_TOKEN` / `OHIP_EDGE_AUTOMATION_FILE`; relevant environment settings,
standard credential directories and matching Downloads files provide no configured identity. Application creation is
awaiting a delegated CLI credential, not a tooling re-download. No new application or key has been created.
## Documentation And Repository Handoff On 2026-09-06
- Added root `PROJECT_GUIDE.md` as a Chinese project explanation and handoff guide. It consolidates the project goal,
architecture, XML/manual-review/monthly/Booking/company-report/BI flows, module map, configuration, local startup,
migrations, tests, deployment, troubleshooting, security boundaries and new-member checklist. The root README links
to it as the complete project entry point.
- The guide explicitly separates repository implementation from production deployment and business acceptance, and
routes changing operational gaps back to `90-maintenance/stale-items.md`. Local Markdown links, Git whitespace and
the documented Web/worker CLI entry points pass. This documentation-only task changed no application behavior,
database, object store, runtime process or business data.
## Daily Interaction Correction On 2026-08-11
- The local source now treats Daily Report rows as informational table rows rather than hidden log controls. It removes
row click and Enter/Space activation, `role=button`, `tabindex`, selected-row decoration and pointer styling. The
explicit needs-review button still focuses the manual-price panel, report downloads remain links, and only the
top-right `任务日志` link opens the trace dialog.
- JavaScript syntax, all 81 `test_arr_web*.py` regressions and an isolated browser interaction check pass. The browser
proved an ordinary `0805.XML` row leaves the dialog closed, the `待人工处理` control focuses a populated review panel,
and the header utility opens the dialog; there were no console errors. This source change has not been pushed or
deployed to `8.138.234.141:8765`, so the reported production behavior remains until a controlled release.
## Implemented Locally On 2026-08-11
- Implemented Booking parser 2.1.0 exact-header compatibility for the user-confirmed July legacy and August bilingual
source templates. Readable approved header labels are normalized once and then compared as complete cells; the
parser does not use substring, fuzzy, month, filename or worksheet-name matching. Existing aliases, 20-row header
scan, duplicate-header failure and one-file/full-replacement activation semantics remain unchanged.
- Added parser/coordinator/i18n regressions. Four supplied workbooks now parse only their intended source sheets with
the expected 79/111/16 (Lian Tai July), 67/100/16 (Lian Tai August), 235/447/432 (QBD July) and 104/218/212 (QBD
August) rows/items/pending counts; two Daily/channel output workbooks remain rejected. No workbook, OSS object,
draft, Booking batch, Finance fact or runtime process was changed. Deployment and a controlled post-restart
read-only replay remain pending; QBD pending items are existing room-type review work, not a header failure.
## Diagnosed On 2026-08-11
- The reported company-channel Booking Excel parse failure occurs before object storage and draft persistence; a
read-only database snapshot shows no new draft/artifact/batch and accepted batch 7 `july-test.xlsx` remains current.
Exact parser replay isolates two cases: generated Daily/channel report workbooks are correctly rejected as the wrong
input type, while current Lian Tai/QBD raw workbooks expose a parser compatibility defect because bilingual
`Tour Code / 主团号` and hotel-detail headers do not equal the narrow exact alias allowlist. Replacing only those two
headers in memory makes both raw workbooks parse, with original files and all business state unchanged. At diagnosis,
the controlled alias expansion plus regression fixtures remained unimplemented. The user has now explicitly confirmed that both
supplied formats must be supported. An exact three-alias process-memory probe recognizes only the intended sheet in
each file: Lian Tai yields 67 rows/100 items/16 pending, while QBD 2026-08-06 yields 104 rows/218 items/212 pending;
Daily/channel output workbooks remain rejected. This parser-only plan needs no migration or upload-page redesign, but
the existing one-file/full-replacement activation model still cannot append two separately uploaded files.
- The exact desktop `0806.XML` deterministically fails processor 4.0.0 before any row or price processing with
`XML_PARSE_ERROR` at line 1872, column 0. A `TRACE_TEXT` value contains one CESU-8 surrogate pair representing
`U+1F389` even though the document declares UTF-8; the file is structurally closed and not truncated. This error is
outside the pure-`PRICE_UNMATCHED` review boundary, so a formal failure with no manual-price panel is correct. The
public deployment health endpoint remains 200. The source must be re-exported as valid UTF-8 and uploaded as a new
task; no source, runtime, database, Finance, object-store or event state was changed during diagnosis.
## Artifact Conversion On 2026-08-11
- The user-supplied `8.6 修正.XML` was an XLSX package mislabeled with an XML extension. Its 181-row first sheet
contains the flattened Opera fields needed by the ARR parser. A separate UTF-8 `RES_DETAIL` XML was reconstructed
from those rows and passed strict XML/UTF-8 checks plus processor 4.0.0: 115 retained rows, 37 rate-code exclusions,
29 duplicates and zero price-unmatched/review rows. The original workbook and malformed XML remain unchanged; no
upload, Finance, database, object-store or event state was changed.
## Runtime Recovery On 2026-08-06
- Restored the local ARR login page after a reported opening failure. No Web process was listening and the retained
Keychain-backed 8766 launcher still passed two removed Node/artifact-tool flags. Removed only those obsolete flags,
then started one detached `arr2-web-8766` Screen session. `/healthz` returns 200 and root redirects to login with no
browser console error. No login, upload, database, Finance or object-store mutation was performed. The existing
reboot-persistent supervision follow-up remains open.
## Deployed And Accepted On 2026-08-06
- Reconciled the live migration-016 function/comment semantics without rerunning 016, created a privacy-minimized
pre-017 checkpoint, and ran a transaction-only up/down probe. The first probe exposed a real legacy
`artifact_callback`/`direct_mcp` run-constraint drift and rolled back cleanly; corrected 017 preserves that contract.
Formally applied migration 017 SHA-256 `22a0578e…67b5b` under an advisory lock with all original business table counts
unchanged. The guarded down migration SHA-256 is `9e85af0c…29101`.
- Closed incomplete runs 61–63 through the normal repository failure transition as
`REVIEW_SCHEMA_MIGRATION_MISSING`, retaining all three source artifacts and adding only failure-audit events. The
first post-migration upload, run 64, then exposed a 16-value/15-placeholder delivery INSERT bug and closed safely as
`DATABASE_WRITE_FAILED`; the placeholder and a focused regression were corrected.
- Restarted Web as PID 24225 with all six authenticated readiness flags true. A subsequent exact-hash `0805.XML`
upload is now run 65 / open review case `dailyreview-878e45ae132b73c131560299b3b2dcb3`: the live page shows the two
expected Lian Tai keys and candidate prices at `0 / 2`, while confirmation remains disabled. PostgreSQL has one open
revision-0 case, two unset items and one required event, with no daily XLSX, manual manifest, Finance version, run
outbox or new monthly event. Historical daily version 28 remains rejected and unchanged. Finance-priced finalization
is the remaining authorized business step.
- Subsequent employee interactions created two independent frozen cases: run 66 stores GRP1/LBLT as `2300/0`, and
latest run 67 stores `200/0`. Both stopped safely as retryable `generation_failed` with no Finance version or run
outbox event. Diagnosis found two finalization defects: the live artifact-kind constraint omitted
`manual_override_json`, and the Finance-version INSERT had 21 placeholders for 20 values. Migration 018
(`5600d825…cd00`) was rollback-probed and formally applied as the additive artifact-kind correction; the surplus SQL
placeholder was removed. A real PostgreSQL outer-transaction review-to-Finance slice now reaches one active version,
one manual row and one commit event before rolling back to zero residue.
- Web is now PID 26286 with all six readiness flags true. The review UI/API displays and accepts only non-negative
integers while preserving exact `.00` database/manifest normalization. At the finalization-repair handoff, run 67
was revision 2 `generation_failed`, read back as `200` and `0`, and had not been retried by that repair; run 66 held a
different frozen GRP1 value. That checkpoint is historical and the later browser-visible state is recorded below.
Historical version 28 remained rejected and unchanged at the repair checkpoint.
- The manual-review UI follow-up is runtime-active without a Web restart because static files are read on each request.
`待人工处理` plus progress are one operation button that focuses/scrolls the price panel without opening the task
log; retryable cases omit the removed frozen-list sentence; finalization projects `日报生成中`; and the complete
review panel/dialog/error surface follows the Chinese/English/Thai selector. Authenticated read-only browser QA
verified both a retryable and an editable case. During that QA, history had advanced outside this task: jobs
`arrjob-e36d8c4c133b48dbb81a57a002e41d76` and `arrjob-cce736734c5e4731b733f03c4a9a3b76` displayed succeeded, while
`arrjob-d3bbbb435cae4559b5f69cb7ea331cee` and `arrjob-dddc27119bea43b19588c78eac087763` still displayed needs-review.
This UI task issued no price save, finalize/retry/cancel submission or upload, so it does not attribute those external
lifecycle changes to itself.
## Diagnosed On 2026-08-06
- Diagnosed the user's fresh post-v4 `0805.XML` upload read-only. The page shows `请求未完成`, while PostgreSQL has
three new v4 run/attempt shells (61–63 / 53–55) stuck `running`, three exact 948,683-byte source artifacts, no
delivery, Finance version or outbox event. Live database effects match 016 but migration 017 is absent: review tables
do not exist and lifecycle checks permit only success/failed. An isolated same-hash v4 replay plus independent
validation succeeds as `review_required` with exactly `LIAN TAI / LBLT / 0` and `LIAN TAI / GRP1 / 1150`. The Web
transaction therefore fails on the missing review table and its best-effort closure fails at the same dependency.
No live migration, cleanup, re-upload, review edit or business write was performed.
- Diagnosed deployed daily job `arrjob-f1cd01f5fddd458cbdafada0ec7dd14d` read-only. A local XML with the exact logged
948,683-byte/SHA-256 identity reproduces the processor-3.0.0 failure: Lian Tai `LBLT + 0` and `GRP1 + 1150` are absent
from the frozen price reference. All 151 `validation_failed` outcomes are `BATCH_NOT_VALIDATED` fallout; they are not
separate source-field errors. Finance version 28 remains rejected, and no price, code, server, database or job state
was changed. Finance must approve the missing totals or an explicit zero-night rule before rebuild, exact replay and a
fresh upload.
## Implemented Locally On 2026-08-06
- Added the v4 `PRICE_UNMATCHED`-only manual-price-review path for the active fixed-processor/artifact-callback flow.
A pure missing-price result records an audited, privacy-minimized `awaiting_review` case and returns `needs_review`
without a daily XLSX, Finance version, rejected version, failure outbox or monthly event. Mixed errors remain failures.
- Authenticated/CSRF review APIs and the Daily Report panel page grouped keys, candidate fixed prices, aggregate impact
and revision-locked non-negative integer prices (including `0`), then normalize exact `.00` storage/manifest values. Finalization freezes canonical provenance, rematerializes
the registered source XML and independently replays before its one atomic Finance/outbox commit. Infrastructure
retries retain the manifest; deterministic final errors close the review/run.
- Migrations 017/018 and their guarded down migrations, v4 processor package/schema, trace v4 and package checksum parity were
locally verified. After the navigation/progress/localization follow-up, the dependency-complete `.venv` suite passes
393 tests with three intentional private-fixture skips; direct-MCP remains an explicit v3 no-review compatibility
projection. The controlled rollout and later browser-visible user activity supply live review/success state, while
this follow-up itself remains UI-only and produced no Finance or monthly mutation.
## Completed On 2026-08-04
- Repaired deployment availability for monthly and company report artifacts. Removed the monthly Node/private-package
runtime path and the stale Node builders/package manifests, added Python/openpyxl monthly validation, and added
shared OSS publication/read routing with hash/size/MIME rechecks. Migration 016 allows OSS monthly artifact
identities while preserving historical local rows. Local fake-object-store, builder, publisher, download-router and
migration tests pass; the development machine has no Docker, so CentOS image/Compose acceptance is explicitly handed
to the operator. No live report or business data was changed.
- Fixed the reported `MONTHLY_REPORT_OUTPUT_VALIDATION_FAILED` false negative for the 2026-08-03 440-row monthly
workbook. `_validate_workbook` now scans read-only sheets sequentially with `iter_rows` and compares Excel-decimal
readback values within `0.000001`; sheet order, headers, dimensions, semantic identity, formula count and exact
`=R[row]*C[row]*G[row]` formulas remain strict. A 440-row/five-sheet decimal regression and the 18-case monthly
builder/publishing/worker/service/repository suite pass. The dead/pending outbox events were not modified.
## Completed On 2026-08-03
- Removed the private npm dependency from the company-channel report deployment path after CentOS Docker build failed
with `@oai/artifact-tool` 404. The company workbook builder now uses Python/openpyxl inside Web, keeps formula-injection
text escaping, produces no preview PNGs, and validates regenerated workbooks after saving. `compose.yaml` starts Web
with `--enable-company-reports`; HTTP/IP test overrides must keep that flag while omitting `--secure-cookies`.
Focused company-report and deployment-entrypoint tests pass 19/19. No database migration or live server deployment was
performed from this workstation.
- Made the mobile H5 dashboard publicly readable without weakening the desktop/operator boundary. Anonymous users can
load `/h5`, its H5 assets and purpose-built `/api/public/h5/months` plus `/api/public/h5/analytics` aggregate routes;
the public projection omits source hashes and operational metadata. Generic analytics, legacy H5 APIs, desktop pages,
detailed health, jobs/traces, downloads and all write paths remain authenticated. H5 keeps optional authenticated
logout, uses no-detail `/healthz` for its connection indicator, and 71 `test_arr_web*` tests plus syntax checks pass.
No live service restart or public deployment was performed.
- Clarified ARR trace semantics for internet-facing deployment. `artifact_callback` traces now expose additive
`execution_scope=arr_runtime`, `processor_mode=fixed_processor` and `remote_dispatch=none`; legacy `direct_mcp`
traces identify remote Agent/MCP delivery. User-visible messages no longer call ARR output “本地处理”, and the
queued downstream message explicitly says Finance database commit is complete while the outbox waits for its
consumer. Persisted `local-...` delivery keys and existing trace fields remain unchanged. Trace/Web tests (27) plus
Python/JavaScript syntax and diff checks pass; no live task or business data was mutated.
- Performed a read-only live diagnosis after a user reported that Daily Report uploaded but monthly did not update.
Daily run 39 is accepted and Finance version 14 is active with 111 retained rows for 2026-08-01; its
`arr.daily_version_committed` outbox event was initially pending with zero attempts. The dedicated worker was then
started in detached Screen, consumed the backlog through event 20, and published active August V01 (`更新至
2026-08-01`, 111 rows); July V05 (`更新至 2026-07-27`, 987 rows) also became active while older July V04 was
superseded. The registered XLSX/result pair exists and the Web health endpoint remains ready. The worker is running
for this session, but reboot-persistent supervision is still open; no re-upload or source-code change was made.
- Performed a second read-only BI freshness diagnosis after August publication advanced. Active August V02 is now
`更新至 2026-08-02` with 268 rows, and a fresh repeatable-read analytics query returns the same watermark and
`updated_at=2026-08-03 14:21:29 +08`. An already-open BI page can still show 8.1 because `app.js` loads analytics
only at boot, first BI entry or month change; the monthly page's four-second poll does not refresh BI. This is a
frontend freshness bug, not a monthly worker/database publication failure. No code or business data changed.
- Implemented BI freshness detection for desktop and public H5. While visible, each surface checks its lightweight
month metadata endpoint every five seconds and reloads full analytics only when the selected month's `updated_at`
changes or the selected month changes. Polling pauses while hidden, resumes with an immediate check, preserves the
last good snapshot during transient failures, and keeps the existing four-second monthly-history polling separate.
Static BI/Web tests pass 5/5 and 19/19; both JavaScript syntax checks and `git diff --check` pass. No API, report or
business data behavior changed.
- Fixed company-report duplicate publication. A retry now validates the existing archive/result pair against the
deterministic reservation and builder `semantic_sha256`, verifies the archive hash against the result JSON, and
reuses the first successful artifact metadata instead of comparing the new XLSX binary SHA. Partial, corrupt or
semantically conflicting pairs fail closed; an existing `current` file is not overwritten, while a missing one can be
repaired from the authoritative archive. First-publication rollback behavior and monthly publication code are
unchanged. Publisher tests pass 6/6, company-report tests pass 32 with five optional ArtifactTool skips, Web
company/trace tests pass 13/13 and Python compilation is clean. No live report rerun or business-data mutation was
performed; the historical 2026-07 `11-20` retry remains to be rerun as a separate acceptance action.
- Added Booking Excel to company-report traceability. New report jobs persist a safe source summary captured server-side
at submission (batch id, filename, activation time and counts); the company page now shows the active source, job
detail shows the submission-time source, and history adds a source column. Re-uploading the same active workbook is
treated as an informational refresh that keeps the existing source and report history; it does not re-extract or
auto-generate a report. Historical jobs without source metadata remain readable and show that the source was not
recorded. Full discovery passes 360 tests with 10 optional skips; no live upload, activation, report generation or
service restart was performed because the available browser session was unauthenticated.
- A read-only live follow-up found accepted Booking Excel batch 7 active with 72 rows and no review draft. The latest
August `01-10` jobs contain `source: null` and all five company results fail at `publish` with
`COMPANY_REPORT_PUBLISH_FAILED` after building row counts. The port-8766 Web process predates both source-traceability
and current duplicate-publication handling, so a controlled Web restart followed by one authorized rerun is required;
no restart or backfill was performed.
- Clarified company-report source and publication status copy for operators. The job panel now says `本次任务使用的
Excel`; missing metadata says `未记录,无法确认使用了哪份 Excel` and explains that the filename/batch were not saved.
`COMPANY_REPORT_PUBLISH_FAILED` now says the data reached publication but the official Excel was not saved, and
explicitly distinguishes that error from successful reuse of a complete identical version. Focused Web/company and
publisher tests plus JavaScript syntax checks pass. Existing `source: null` jobs remain untraceable and no live
restart, report rerun or business-data mutation was performed.
- Removed the redundant Booking Excel provenance card from company-report job details and the provenance column from
generation history. The upload/review current-source panel and server-side job `source` metadata remain intact for
operation and audit. Web/company regression passes 29 tests, JavaScript syntax and runtime-reference checks pass,
and no report or business data changed.
- After the operator-reported 8766 restart and another `2026-08/01-10` attempt, job
`253ce23dc7544d34a6e0fb9405ac4d9a` again built all five row sets (`54/18/7/1/15`) but failed at `publish`; the prior
`c5358fa293184f5f9bad85178afada22` succeeded with the same counts and complete artifacts. Read-only process evidence
still shows PID `11176` started on 2026-08-02 12:20, before the current duplicate-publication source change, so the
effective 8766 listener was not replaced. Publish copy was simplified to direct restart-and-retry instructions; no
report, database or output mutation was performed by this recheck.
- The operator's latest `2026-08/01-10` retry, job `087dceca79e64bebb719ad06e7813465`, finished at 15:29 +08 with the
same five row counts and the same publish-only failures. At 15:37 +08, TCP 8766 was still owned by PID 11176 under
the 2026-08-02 Screen session; the launcher preflight is ready, but the listener still predates the current publisher
and job-source modules. The earlier successful five archive/result pairs and current downloads all remain
SHA-256-consistent, and six focused publisher tests pass. No restart, rerun, file repair or business-data write was
performed; exact listener replacement remains the required operational fix.
- With explicit operator confirmation, the exact stale PID 11176 was stopped and replaced by PID 54127 at 15:46:29
+08 through the existing launcher. One authorized job `05cc547d62854df281b0c9cac60e6f6d` then succeeded at 15:48:37
+08 for all five companies with row counts `54/18/7/1/15`; the new job recorded active Booking batch 7 source
metadata, reused the same version numbers/artifact descriptors as `c5358fa...`, and all five authenticated HTTP
downloads returned 200 with matching archive/current/result hashes. The prior files were not overwritten, the
temporary session was logged out, and no Booking/Finance source or fact mutation occurred.
- Confirmed the source contracts for repeated Booking/report workflows: byte-identical activated Excel uploads reuse the
activated source; same rows with different XLSX bytes create a new reviewable source; unchanged report snapshots
reuse their complete publication pair; changed Finance or Booking version pins create a new report version; and an
activated subset changes Booking detail coverage without deleting the Finance fact rows. Focused source/publisher/
integration checks pass 14 tests with two optional ArtifactTool skips. The controlled 8766 replacement and one live
5/5 rerun now pass; reboot-persistent supervision remains a separate deployment gap.
- Confirmed a separate operator-visibility gap: the publisher reuses the archive/result pair internally, but neither
`PublicationOutcome`, `CompanyRunResult` nor the public company-job projection exposes a reuse disposition or prior file
identity. A successful retry therefore looks like a normal new successful job with a download link; no code change was
made in this read-only check.
## Completed On 2026-08-02
- Restored cross-month history visibility for Daily Report, monthly processing and company-channel generation history.
Each list now has an independent previous/month/next/`本月` navigator and defaults to its latest non-empty month using
authenticated read-only `GET /api/history-months`. Counts and empty states name the active month and can jump to the
latest month with records. Company `生成月份` is now visibly labeled and independent from history `查看月份`; monthly
polling follows the viewing month without changing generation contracts. A guarded live read returns July counts of
30 daily and four monthly records, while company state retains four July jobs. The full 356-test suite passes with 10
skips, and isolated Chinese/English/Thai browser QA at 1440/900/390 pixels found no page overflow. Port 8766 was
restarted under detached Screen and is `ready`; no upload, report generation, source activation or business-data write
occurred.
## Completed On 2026-07-31
- Refined the Channel BI utility surface in preserve mode: removed the visible BI panel heading and ready-state
`数据库已连接` copy while retaining the navigation label, browser metadata and semantic status dot. Compressed the
month selector to a compact control on desktop/H5, and changed task-log/logout utilities from button chrome to
low-emphasis accessible links without changing their behavior. JavaScript syntax plus focused BI, daily visual,
task-log and auth tests pass; no API or business data changed.
- Tightened the Channel BI panel's top rhythm after the heading removal: the desktop panel now starts 20px higher
relative to the shared 38px page padding, while the responsive desktop shell keeps a 10px mobile-only adjustment.
The four-tab bar, panel content and BI data behavior are unchanged; focused Web regression remains green.
- Refined the Channel BI presentation and data-range contract. Removed the BI-only CHANNEL PERFORMANCE, snapshot
watermark copy and visible TOTAL PRICE labels on desktop and H5, and added a localized 数据范围 line below the
company-sales title. The read-only analytics payload now supplies the minimum and maximum ARRIVAL coverage dates
from one repeatable-read current-version snapshot; no Finance/report business data changed. JavaScript syntax and
focused analytics/Web/UI tests pass.
- Implemented the ARR Web Chinese/English/Thai presentation layer. Desktop, H5 and login now share `arr_web/static/i18n.js` with locale selectors, localStorage/cookie preference, `html.lang`, dynamic prompt/API-error translation, Bangkok/Gregorian/Latin-digit date/number formatting and locale-aware duration/money display. The runtime preserves original source strings so switching back to Chinese is safe. `ARR Report`, operational proper nouns, business/API behavior and XLSX/monthly/company report output contracts remain unchanged. Scoped Web regression passed 61/61; full discovery still has only the pre-existing environment errors for missing `httpx`/unavailable OSS client.
- Rotated both ARR Web operator credential values in separate macOS Keychain items without recording either value in
source, launcher arguments, logs or project memory. The exact port-8766 listener was stopped by controlled SIGINT and replaced at
15:30 +08 under one detached `arr2-web-8766` Screen session. Live acceptance rejects the prior pair, accepts the new
pair, verifies hardened cookie/session/CSRF/logout, desktop/H5, anonymous route boundaries, all six detailed readiness
flags and loopback/LAN health. Two read-only snapshots stayed at 30 daily jobs, 4 monthly versions and 4 company jobs;
the newest business records predate the restart, so no business write occurred. Nine focused auth/deployment tests and
credential-literal scans of the workspace, launcher, state logs and process list pass. The requested password still
matches the username, so the distinct high-entropy password follow-up remains open.
- Simplified the three company-channel generation cards by removing the visible `第一期`/`第二期`/`第三期`
labels and making the C/O ranges the primary card values: `C/O:01-10`, `C/O:11-20` and a month-aware final range
(`C/O:21-30` for 30-day months or `C/O:21-31` for 31-day months).
Completion-state chips (`周期未结束` / `周期已结束`) and Bangkok completion times remain, while the underlying period
keys and generation payload are unchanged. An incomplete period is now still generatable; future months remain blocked.
JavaScript/HTML checks, 28 focused Web/company tests, 348-test discovery and isolated 1280x720/390x844 browser QA
pass with no overflow or page-console warnings. The shared port-8766 service was restarted at 14:36:45 +08 and
its `/healthz` endpoint returns `ready`.
- Simplified company report results for end users: duplicate review problems are collapsed by type/code/period so a
repeated `同房型存在不同静态价格,需人工复核` item appears once per company and period. Replaced the internal
`版本`/`version_no` display with `生成时间`, using the completed job time and falling back to its created time;
API version metadata remains intact. JavaScript/HTML checks, 28 focused Web/company tests and targeted deduplication
execution pass.
- Rebuilt the company-channel report setup as a dense four-card desktop row: `上传 Excel 报表` followed by the first,
second and third C/O periods. At that point the `报表月份` picker was a compact visually unlabeled control in the large
setup card's upper-right corner; the 2026-08-02 history repair later labeled it `生成月份` and moved history filtering
to its own control. All period CTAs read `生成` with responsive card-sized widths. Replaced the
browser-native generation confirm with an in-page accessible dialog showing month/period context; cancel, backdrop
and Escape dismiss without submitting, while explicit confirmation preserves the existing payload, generation polling
and business behavior. JavaScript/HTML checks, 28 focused Web/company tests, 348-test discovery and isolated
1280x720/390x844 browser QA pass with no overflow or console warnings; the shared port-8766 service was restarted at
14:36:45 +08 and its `/healthz` endpoint returns `ready`.
- Rebalanced the company-channel setup surface for the current Finance workflow. The fixed five-company scope now sits
beside `公司渠道明细` as pale helper text, the Excel upload action is bounded to a 760px desktop rail and remains
full-width/single-column on mobile, and `刷新任务` exposes a read-only scope tooltip. The generation month remains the
C/O report-month selector for period completeness and the generation payload; its former history-filter role was
removed by the 2026-08-02 cross-month history repair. No report,
upload or database behavior changed. JavaScript/HTML checks, 28 focused Web/company tests, 348-test discovery and
isolated 1280x720/390x844 browser QA pass with no overflow or console warnings. Port 8766 was not mutated by QA.
- Compressed the daily overview row to a compact equal-height desktop treatment. The upload card now uses a horizontal
icon-and-copy dropzone, reduced heading/footer spacing and smaller controls, while the three KPI cards stretch to the
same row height. Mobile upload layout remains unchanged. JavaScript syntax and 20 focused Web/static/trace tests pass;
no upload, API or processing behavior changed.
- Refined the company-channel generation controls for dense Finance use. The three period CTAs are now compact
104–124px actions centered inside each card, while `提取并核对` uses the same 42px button family and is centered
inside the upload action column on desktop and mobile. Labels remain single-line, upload/report behavior is
unchanged, 28 focused Web/company tests and the 348-test discovery pass, and the restarted port-8766 service is
healthy at 13:37:49 +08.
- Restored equal card heights across the daily overview row. The ARR.XML upload panel and the three KPI cards now
stretch to the same grid-row height, with KPI content centered inside each card; mobile stacking remains unchanged.
JavaScript syntax and 20 focused Web/static/trace tests pass; no upload, API or processing behavior changed.
- Reverted the KPI width shrink after clarification. The three daily cards now retain their original grid-column widths,
while their height is content-sized and vertically centered in the upload module's shared desktop row. JavaScript
syntax and 20 focused Web/static/trace tests pass; no upload, API or processing behavior changed.
- Centered the shortened daily KPI cards within the upload module's shared desktop grid row, preserving their widths,
270px height and mobile content-sized fallback. JavaScript syntax and 20 focused Web/static/trace tests pass; no
upload, API or processing behavior changed.
- Tightened the three daily KPI cards so they no longer inherit the upload panel's full grid-row height. The desktop
cards keep their existing widths and data hierarchy, use a compact 270px height with smaller decorative rings, and
return to content-sized cards on narrow screens. JavaScript syntax and 20 focused Web/static/trace tests pass; no
upload, API or processing behavior changed.
- Recomposed the daily overview into one desktop row containing the ARR.XML upload station plus the ARRIVAL DATE,
processing-duration and NO. OF ROOM cards. Removed the duplicate top `Daily Report` heading and `THIS MONTH` eyebrow,
renamed the daily-history heading to `Daily Report`, and kept the upload request, inline progress estimate and
on-demand task-log behavior unchanged. JavaScript syntax and 20 focused Web/static/trace tests pass; no API or
processing behavior changed.
- Updated the daily XML upload surface so submitting ARR.XML stays on the daily page instead of opening the task-log
dialog automatically. The upload card now shows a compact stage-based estimate for upload, fixed processing,
validation and database commit, finalizing at 100% on success and retaining an inline error state on failure. The
header task-log button remains the sole on-demand trace entry; the later 2026-08-11 interaction correction removed
daily-history row log activation. JavaScript syntax and the original 15 focused Web/static/trace tests passed; no API
or processing behavior changed.
- Simplified the desktop monthly page into a single six-column download table. The redundant standard-monthly heading,
`VERSION HISTORY`/version-record copy, visible monthly `版本` column and C/O-period footer note are removed; the
navigation label is now `月报`; the list is identified by a compact `月报处理` heading. The visible `更新至` cell reads the explicit `max_arrival_date` API field, which is
backed by the published run's `as_of_date` (the maximum included `ARRIVAL`) while retaining the legacy field and
version ordering for compatibility. The remaining panel uses a compact live-status toolbar and responsive table
spacing; focused Web/schema/task-log tests and JavaScript/Python syntax checks pass. No report or business data changed.
- Froze the Markdown-backed July company-channel baseline before any Booking Excel activation. The read-only,
non-publishing package binds the exact `RES_COMMENT_TYPE_OF_ROOM.md` hash to accepted Booking batch 1, five pinned
Finance daily versions, processor 1.2.0/rule identity and five generated XLSX files. All 314 output rows independently
match the Markdown-derived Booking Room expectation; 27 are filled and 287 are correctly blank. The builder reopened
and exact-value checked every workbook, rendered all 15 sheets, and the retained SHA-256 inventory verifies every
package file. One reviewing Excel draft remained separate; the current Booking pointer and room-item counts were
unchanged.
- Refined the Booking record-extraction review surface for dense operator work. The page now renders 50 records at a
time, supports individual and all-visible selection, and deletes 1-50 unique selected records through one bounded
atomic backend operation. Single and batch delete share a count-aware in-page dialog; cancel, backdrop and explicit
Escape handling never submit and restore focus. The separate accepted-source status/summary is removed; the open
review now identifies its own extraction records with the validated uploaded workbook filename directly below
`Booking记录提取`, wrapping fully on narrow screens. The requested review/upload helper copy is removed. Isolated authenticated browser QA covered one/two/50-row
selection plus 390×844 layout without calling delete; the full suite passes 346 tests with 10 expected optional skips.
- Implemented the deterministic Booking Excel extraction program requested for raw Tour Code/`โรงแรม` workbooks.
It applies physically-last-row replacement/cancellation, splits bracketed room items, normalizes agreed TWN/DBL
variants, preserves quantities on unknown labels, and routes unknown/unbracketed room names to editable/deletable
pending records. The supplied workbook replays to 26 Tour Codes, 37 items and 7 pending items; `LLT260715AC` becomes
`TWN/12 + DBL/9`, while `LT260715LD` becomes `U-TWN/17 + pending/2`. Durable review/activation, paged desktop UI and
bounded GET/POST/PATCH/DELETE transport are present. A real-PostgreSQL transaction probe created a two-item draft,
corrected its pending item, atomically activated one three-room source row and then rolled the outer transaction back;
source batch 1, zero drafts and zero synthetic artifacts were restored. No persistent Booking/report business write
was performed.
- Confirmed end-to-end readiness boundaries. The company-channel processor already reads current Booking views at report
generation; a live read-only July snapshot produced valid 5/5 results from 417 Finance facts and 27 matched Booking
Group Codes, with missing/unmatched Booking Room blank. The expanded Booking/company/real-XLSX suite passed 55/55.
The controlled real-PostgreSQL draft/edit/activation path passed inside an outer rollback. July `21-month-end` does not open until
2026-08-01 00:00 Bangkok, and a shared-database test workbook must be a deliberate complete replacement.
- Audited Booking parser 2.0's human-review requirements across the live schema, current source and active Web process.
During the audit, concurrent work applied migrations 014/015: the live database now has a current-source pointer plus
empty draft/item tables supporting basic confirmed/pending/deleted latest-state editing. It still lacks actor, reason
and revision history. Its earlier GET/POST-only transport finding was subsequently repaired with PATCH/DELETE handlers
and real socket coverage; real PostgreSQL write/rollback acceptance now passes. The audit itself made no persistent
database/runtime/business-data mutation.
- Completed a privacy-minimized, read-only Booking dimension/database audit. `Group Code + room type + quantity` is the
sufficient normalized allocation model for current data, whose nonblank codes do not cross stay/company/channel;
missing/unmatched enrichment is blank as designed. Its initial parser/importer snapshot was superseded by the dedicated
manual-review audit above; migrations 014/015 are formally applied and the transaction boundary is verified, while the
first operator-authorized real workbook activation remains incomplete.
No business data changed by this audit.
- Reduced the ARR login gateway to one clear brand statement and one form. The old workflow marketing copy, numbered
steps, repeated welcome/access copy and help/footer disclaimers are removed; the remaining field labels are
`username` and `password`. Existing password visibility, loading/error, safe-return and authentication behavior is
unchanged. Thirty-three focused Web/auth/UI tests pass, and live 390x844 plus 1280x720 checks show no horizontal
overflow or browser warnings/errors.
## Completed On 2026-07-30
- Added application-owned Finance login across desktop, H5, APIs, uploads, traces and downloads. Runtime credentials are
required, login attempts are bounded, random server-side sessions retain hardened cookies/CSRF, logout revokes the
session, and only login assets plus no-detail `/healthz` remain anonymous. Caddy now owns HTTPS only.
- Added a responsive ARR login gateway and desktop/H5 logout/session-expiry behavior. The live source passed wrong and
correct login, password visibility, safe `/`/`/h5` return, both logout paths, zero-console-error checks and
375/768/1024/1440 no-overflow verification.
- Added and applied additive migration 013. New uploads store the validated browser XML basename on
`ingestion.processing_runs`, while private source artifacts and processor input remain canonical `source.xml`.
Daily history and task trace read only the new provenance; pre-013 rows render `—`.
- Added and applied additive migration 012. The `reporting` schema stores monthly versions, Finance daily-version
lineage, channel row-count manifests and two artifact references without duplicating business/guest rows.
- Replaced in-memory monthly identities with database IDs, sequential versions, canonical snapshot hashes, atomic
activation/supersession, persisted failures and idempotent published-snapshot replay.
- Made the report's `as_of_date` equal the greatest `ARRIVAL` actually included in its snapshot. XML filenames and the
wall clock are ignored.
- Added a standalone `monthly_reports.worker` process with leases, `FOR UPDATE SKIP LOCKED`, expired-lease reclaim,
bounded retry/backoff and dead-letter behavior.
- Made outbox acknowledgement conditional on a registered active/superseded report and both workbook/result artifacts.
- Replaced the synthetic monthly list and unavailable download resolver with `reporting.monthly_runs` reads and
confined path/size/SHA-256 checked downloads.
- Removed month/cutoff/manual-generation controls from the primary page. The guarded POST route remains only as a
controlled recovery surface when explicitly enabled.
- Changed every XLSX data-row `TOTAL PRICE` cell to the exact row-relative `=R[row]*C[row]*G[row]` formula and validates
the complete formula matrix again after reopening the workbook.
- Removed the monthly refresh control. The visible monthly tab now performs one non-overlapping list read every four
seconds, stops while hidden/inactive, reloads immediately when restored, and preserves the last good list during a
transient background failure.
- The desktop and H5 headers use the plain `ARR Report` identity with no decorative icon. The daily content heading is
`Daily Report`; the duplicated daily/monthly explanatory copy has been removed without changing automatic publishing.
- The desktop header utility formerly labeled `手机看板` is now `任务日志` and opens the existing black task console in
a native modal. The console no longer occupies the daily-processing layout, and the 2026-08-11 interaction correction
makes this header utility its only opener; upload completion and Daily rows do not open it. `/h5` remains available
by direct URL. Both history and trace SQL are explicitly limited to `pipeline_type = 'opera_daily'`, so this is a
one-daily-job processing trace rather than a global server, monthly-run or company-report log.
- Refined the daily desktop surface after visual review. `ARR Report` remains the dominant workspace title while
`Daily Report` is smaller; `任务日志` is a compact outlined button at the adjacent status-label size; the upload
station is centered and responsive; decorative `01 / UPLOAD` and `本月留痕` labels are gone; and `开始处理` is a
compact right-aligned action. No upload, API, route or trace behavior changed.
- Daily, monthly and selected-month company histories use 50 records per page. Each footer shows the exact monthly
total, current visible range, page number and previous/next controls; counts and rows are read from one database
snapshot or coordinator lock. Channel BI remains an aggregate view rather than a paginated detail list.
## Live Acceptance
- Five `arr.daily_version_committed` events have produced July publications: one is the earlier database acceptance
fixture `mvp-v1-fixture-20260727`; four are real 07-20/07-21/07-22/07-23 uploads.
- Report ID 4/version 4 is active for 2026-07 with `as_of_date=2026-07-27`, 417 rows and six channels; V03/V02/V01 are
superseded. Its persisted date equals max current `ARRIVAL` structurally, but that maximum comes from the fixture.
- The superseded V03 workbook has 308 authorized `TOTAL PRICE` formulas and zero mismatches. Its 40,635 bytes and SHA-256
`494fb78283f68cb7bffce2501b3531613c494d148a56a7ccc8d2aabe46b1e29c` match the registered artifact.
- Earlier browser/access-log verification showed V03/V02/V01 downloads and repeated monthly API reads at the
four-second cadence. The current API now lists V04 active above those versions; ARR2 Web remains green and the worker
remains separate.
- ARR2 Web is active on all local interfaces at port 8766 under detached Screen session `arr2-web-8766`. The current
trusted-Wi-Fi entry is `http://192.168.3.103:8766/`; anonymous root redirects to login and `/login` plus `/healthz`
return HTTP 200. The current process restarted at 2026-07-31 19:27:42 +08 to load the Web i18n static resources
after the source implementation; it loads the Booking bulk-review
composition; the public health check returns `ready`.
Authenticated acceptance reports database, processing, monthly reports, downloads, company reports and company-source
upload ready. At the earlier 11:30 acceptance the draft endpoint returned no open draft; this later UI task did not
authenticate against, inspect or mutate the shared draft contents. Anonymous PATCH/DELETE reach the application auth gate and return JSON
401 rather than transport-level 501. Migrations 014/015 are live and the current pointer selects batch 1; no persistent
Booking write was performed. Legacy port 8765 remains closed; the mode-0700 launcher keeps secrets outside the repository.
- The active ARR2 analytics API on port 8766 returns 417 rooms because the known one-row fixture remains current.
- Live pagination acceptance on port 8766 currently reports 30 daily jobs, 4 monthly versions and 4 company jobs. All
three render page 1/1 with correct disabled boundary controls; a 390-pixel viewport has no horizontal overflow.
- Migration 013 is live in `booking_test`: 25 total processing runs, zero falsely backfilled upload filenames and a
validated constraint. A rolled-back Unicode-basename probe proved history/trace return the upload name while the
artifact remains `source.xml`.
- The pre-012 privacy-minimized metadata checkpoint is
`runtime/backups/booking_test_pre_012_20260730T151922+0800/manifest.json`, SHA-256
`230206eb074fd5877132744eb592b3dc6cd6638d12a3dd4d71a8101a9bd2998e`.
## Active Data-Quality Incident
- The company-report cutoff-10 and cutoff-20 Web jobs both completed 5/5 with valid zero-row workbooks because every
current supported-company fact has C/O in the 21-to-month-end period. Processor 1.2.0 implements the final
user-confirmed fallback: no Group Code leaves both `RES_COMMENT`/`Booking Room` blank; a present Group Code that
cannot resolve in Booking remains visible while only `Booking Room` is blank. A repeatable-read July 31 preview is
now valid 5/5: LianTai 138 rows/122 blank Booking Rooms, QBD 139/128, DY-AI-Easy-KB 1/1, FengRun 33/33 and HanaTour
3/3. No report or business-data mutation was performed. The active port-8766 runtime now loads the current processor
and reports company-report readiness true; one controlled 5/5 Web job remains a separate acceptance action, with a
post-completion rerun recommended if later source facts should be reflected.
- Finance current version 2 is `synthetic.xml` from provider `local_fixture`; it adds 1 room, 3 room-nights, 5,400
revenue and a synthetic room type to Channel BI and all July monthly publications.
- V01's legitimate operational source is exactly 119 rows with `ARRIVAL=2026-07-21`; its persisted lineage and
hash-matched workbook also contain the one-row 07-27 fixture, which is why the stored report says 120 rows and
`as_of_date=2026-07-27`. This is contaminated content, not a metadata-only date error.
- Excluding the fixture leaves the verified four-day business total of 416 rows/rooms, 853 room-nights and 1,451,350
revenue through ARRIVAL 2026-07-23. Hash matching and isolated replay prove the accepted file mapping is
07-20=100, 07-21=119, 07-22=88 and 07-23=109; the user's total was right but the 07-20/07-22 labels were reversed.
- No database repair was performed during diagnosis. The fixture should be retired from the current projection without
deleting immutable history, followed by a clean July republication and live API verification.
- Channel BI now checks the selected month's `updated_at` every five seconds while visible, so an already-open view
reloads its aggregate data after a new Finance version is published. The historical 308/417 observation above is
retained as evidence of the earlier stale-view behavior, separate from the one-row fixture contamination.
- The BI `公司数` card actually counts worksheet channels; LianTai GROUP/FIT are separate, so six channel keys can still
correspond to five top-level companies.
## Verification Status
- The 2026-07-31 Web i18n implementation passed JavaScript syntax checks, a DOM/runtime locale smoke (Chinese → English → Thai → Chinese), and 61 focused ARR Web tests. A full 298-test discovery was attempted; eight import/runtime errors are environment-only (`httpx` absent and OSS client unavailable), with no i18n-related failure.
- Migration 012 passed transaction-only up/down probes, including a synthetic active publication followed by rollback.
- The 38-test monthly/migration/Web regression set passed, including real XLSX build/reopen checks.
- A clean full-suite rerun with the optional ARR1 compatibility dependency installed passed 291 tests in 108.2 seconds
with 7 explained environment/fixture skips and no failures or errors.
- The automatic-list follow-up passed 18 focused Web/schema tests, JavaScript syntax checking and a clean 291-test full
discovery in 110.8 seconds with the same 7 explained environment/fixture skips.
- The post-update BI diagnosis passed 24 focused analytics/contracts/Web tests and reconciled both live Web APIs against
a repeatable-read, read-only database snapshot.
- Hash-matched local source inspection and isolated deterministic replay reproduced `0720.XML=100` and `0722.XML=88`;
the 07-23 accepted run was traced to its 16:12:27 commit and 109 retained rooms.
- The final scoped company/Booking/report suite ran 32 tests successfully with three expected private-fixture skips; it
included real XLSX export, value verification after reopen, rendering and the dedicated no-Group-Code path. Four Web
company-task coordinator tests also passed.
- The 50-row pagination follow-up passed JavaScript syntax, 29 focused Web/repository tests and the complete 305-test
discovery with 10 existing environment-dependent skips. Live desktop and 390-pixel checks confirmed all three
totals/ranges and boundary-button states.
- The upload-filename change passed 69 focused tests, JavaScript/Python syntax checks and a clean 312-test full
discovery in 99.280 seconds with 10 environment/fixture skips.
- The application-login change passed a 33-test focused auth/Web/company/deployment set after final compatibility edits,
JavaScript/Python syntax checks, Ruby static Compose parsing and the clean 317-test full discovery in 97.311 seconds
with 10 environment/fixture skips. Docker is not installed locally, so live `docker compose config` was not claimed.
- The expanded absent-or-unmatched company-report fallback passed a 37-test
company/Booking/real-XLSX/Web-coordinator suite with three expected private-fixture skips and no failures; the current
controlled July 31 projection previewed valid 5/5. A separate non-publishing real-data vertical slice built, reopened,
value-checked and rendered all five actual workbooks in a temporary directory.
- The daily visual-polish follow-up passed JavaScript syntax and 33 authenticated Web/auth/daily-visual/task-log tests.
Live 375/768/1024/1440 checks confirmed the corrected title hierarchy, centered upload geometry, compact actions,
task-log dialog focus restoration, zero horizontal overflow and zero browser warnings/errors.
- Live login activation passed anonymous root/API rejection, exact credential login, hardened cookie/session/CSRF,
authenticated desktop/H5/history reads, all five readiness flags, logout revocation and loopback/LAN health. Read-only
totals at initial activation were 24 daily jobs, 4 monthly versions and 3 company jobs; no upload, report job or worker
was started.
- The 2026-07-31 credential rotation passes prior-pair rejection, new-pair login, hardened cookie/session/CSRF, logout
revocation, desktop/H5 and all six current detailed readiness flags. Two read-only snapshots remained 30 daily jobs,
4 monthly versions and 4 company jobs, with their latest creation times before the 15:30 restart. No upload, report
generation, Booking activation or monthly worker action occurred.
- Booking extraction runtime acceptance passed authenticated health/source-draft reads, clean logout, anonymous
PATCH/DELETE application routing and direct read-only repository access. At that probe all relevant readiness flags
were true, source batch 1 remained current and no draft existed. A later operator upload created one reviewing draft;
the Markdown baseline freeze proved it remained isolated and did not change batch 1. A 2026-07-31 14:14 +08 live
read-only recheck found no reviewing draft and still found Markdown batch 1 current with 867 rows, six worksheets and
348 Group Codes, so the draft blocker is currently clear without any Booking source switch.
- The same live recheck found that the current July company-report projection has advanced beyond the frozen
five-version baseline: 986 supported-company Finance facts now all have C/O dates from July 21 through July 30.
Read-only processor 1.2.0 output remains valid 5/5 with 598 rows, 224 filled Booking Rooms and 374 blanks. The earlier
314-row package remains correct for its pinned snapshot; it is not the expected row count for this later live
projection. The first two July periods can now be generated from the current snapshot before their calendar
completion; any later Finance facts within the fixed C/O ranges require a rerun.
- Final post-change discovery ran 343 tests in 102.451 seconds: all passed, with 10 explained optional
renderer/private-fixture skips. JavaScript syntax, Python compilation, supplied-workbook replay and the 17 focused
parser/review/coordinator/router/socket tests are also green.
- Booking review persistence passed a real-PostgreSQL transaction-only vertical slice: draft creation exposed two items
with one pending, edit confirmed the pending item, activation produced one source row with quantity three, and the outer
rollback restored batch 1 with no synthetic draft, source or artifact residue.
- A 2026-08-03 diagnosis reproduced the 2026-07 `11-20` company-report retry failure: all five companies failed at
`publish` after an earlier same-period success because repeated XLSX builds had identical semantic SHA-256 values but
different binary SHA-256 values. Publisher idempotency now reuses a complete matching archive/result pair and fails
closed on partial or conflicting state; the historical retry still needs a deliberate live rerun.
- Isolated authenticated browser checks covered the upload-first desktop flow, editable review table, fixed-company text
and responsive 375/390-pixel layouts with no horizontal overflow or console errors.
## Remaining Deployment Work
- Perform the first operator-authorized real workbook upload/review/activation, then run one controlled five-company
report and verify all five downloads. The database transaction boundary is accepted, but this task intentionally did not
replace the current business Booking source. Because activation replaces the whole source, supply a complete workbook
and restoration plan.
- Decide whether Booking confirmation is a simple single-operator correction loop or an auditable approval workflow;
add actor/reason/revision history and stronger declarative DB transitions if audit-grade confirmation is required.
- Upload one controlled raw Tour Code/`โรงแรม` workbook, review/activate it, confirm
replacement semantics and run one controlled company report. A period may be generated before its Bangkok completion
boundary, but rerun it after completion if the source snapshot changes; the currently open July periods contain zero
rows and cannot prove populated Booking Room. Before real use, confirm whether 23 fixture Group Codes shared by
`DY-AI-Easy-KB` and `LIANTAI-FIT` are intentionally additive; the current view merges them globally.
- The prior 8766 outage and credential gate are resolved. The current Web process is a detached local Screen session,
not a reboot-persistent service; `/Users/chillishark/.local/bin/arr2-web-8766 --check` validates its private route and
Keychain inputs without printing them before a controlled restart.
- Live authentication/readiness and one controlled 5/5 company-report job with all five downloads are accepted. One
no-PII XML upload should still confirm migration-013 filename provenance after restart; the Web/worker sessions remain
detached and are not reboot-persistent.
- The latest operator-selected Web credentials were rotated on 2026-07-31, but the password still matches the username.
Rotate it again to a distinct high-entropy value in Keychain, followed by one controlled Web restart.
- The workstation runs Web and worker as separate processes. The checked-in Compose image supports both report paths
through Python/openpyxl; the worker still needs the existing database/OSS secrets and may use `/app/outputs` only for
staging and local `.web-jobs` state. A formally controlled no-PII CentOS Docker acceptance run remains appropriate.
- ARR2.0 now has Git metadata; `main` tracks `origin/main`. Runtime credential values remain outside Git and project
files.
## Last Updated
2026-09-17