# Task History ## Completed Tasks | Date | Task | Outcome | Docs Updated | |---|---|---|---| | 2026-08-03 | Make company-report XLSX generation deploy without private npm | Replaced the company-report builder's Node/private `@oai/artifact-tool` runtime dependency with Python/openpyxl workbook generation and self-validation, removed the private package dependency, enabled `--enable-company-reports` in Compose Web, and documented that only the monthly worker still needs Node/artifact-tool packaging. Focused company-report and deployment-entrypoint tests pass 19/19; no migration or live deployment was performed | Current state/history, architecture, deployment evidence/index, stale item, runbooks | | 2026-08-03 | Execute controlled fix and live-accept 2026-08 `01-10` company report | With explicit confirmation, stopped only the stale PID 11176 and started new listener PID 54127 through the existing Keychain-backed launcher. One authorized job `05cc547d…` succeeded 5/5 with row counts `54/18/7/1/15`, captured active Booking batch-7 source metadata, reused the existing version/artifact identities, and passed five HTTP download/hash checks. Logout and temporary-file cleanup completed; no Booking/Finance source or fact mutation occurred | Current state, runtime evidence/index, stale item, commitments, scoped planning record | | 2026-08-03 | Diagnose the latest 2026-08 `01-10` official-Excel save failure | Read-only evidence confirms newest job `087dceca...` built all five companies (`54/18/7/1/15`) and failed only at publish. Port 8766 is still PID 11176 from 2026-08-02, older than the semantic-reuse publisher fix; the earlier successful five-file archive/result/current set remains hash-consistent and intact. The launcher preflight is ready and six publisher tests pass. Repair is an exact controlled listener replacement followed by one authorized rerun; no restart, report write or business-data mutation was performed | Current state, runtime evidence/index, stale item, scoped planning record | | 2026-08-03 | Check whether company-report retries show reused-file identity | Confirmed the publisher can reuse an existing archive/result pair, but the outcome, job API and frontend expose only success/version/download; users cannot see that the file was reused or which prior artifact supplied it. No code or business-data change was made | Current state, retry-semantics evidence/index | | 2026-08-03 | Confirm repeated Booking and company-report rerun semantics | Verified by source inspection and focused tests: byte-identical activated Excel reuses the source; same rows with different XLSX bytes require a new review/activation; unchanged report snapshots reuse complete publication pairs; a subset source can be activated and rerun, leaving Finance rows present while missing Booking room details remain blank. Live acceptance remains pending the stale 8766 process replacement | Current state, retry-semantics evidence/index, stale item | | 2026-08-03 | Recheck 2026-08 company-report publication after reported 8766 restart | The newest `01-10` job again built all five row sets (54/18/7/1/15) but failed at `publish`; a read-only process check shows the effective listener is still PID 11176 from 2026-08-02, before the current publisher fix. Simplified the confusing duplicate-reuse error copy to direct restart-and-retry instructions; 29 Web/company tests and JavaScript checks pass, with no report or business-data write | Current state, runtime/status-copy evidence, stale item, scoped planning record | | 2026-08-03 | Remove redundant company-report Excel provenance module | Removed the source card from job details and the source column from generation history; retained the upload/review current-source panel and server-side source metadata. The history table and empty state now use seven columns. Web/company tests (29), JavaScript syntax checks and runtime-reference scan pass; no report or business-data write occurred | Current state, status-copy evidence/index, scoped planning record | | 2026-08-03 | Clarify company-report source and publish-failure copy | The job detail/history now identifies the Excel as `本次任务使用的 Excel` / `任务使用的 Excel`; missing source metadata says the Excel cannot be confirmed and explains why. Publish failures now explain that data reached publication but the official Excel was not saved, and are not presented as a normal duplicate skip; a complete identical publication remains a success reuse. Focused Web/company/publisher tests and JavaScript syntax checks pass; no live report or business-data write occurred | Current state, status-copy evidence/index, scoped planning record | | 2026-08-03 | Add five-second Channel BI freshness detection | Desktop and public H5 now poll lightweight month metadata every five seconds while visible, compare the selected month's `updated_at`, and reload full analytics only after a version change. Hidden tabs pause polling, visible tabs check immediately, and transient background errors retain the last good snapshot. BI visual tests pass 5/5, Web tests pass 19/19, both JavaScript syntax checks and diff checks pass; no report or business data changed | Current state/history, Channel BI freshness evidence/index, stale item | | 2026-08-03 | Diagnose BI remaining at 8.1 after August monthly publication | Read-only database and analytics checks confirm active August V02 is `更新至 2026-08-02` with 268 rows, while a fresh BI query returns the same watermark. The existing page only loads analytics at boot, first BI entry or month change, so an already-open view can remain at 8.1. Confirmed a frontend freshness bug; no code or business data changed | Current state/history, BI freshness evidence/index, existing stale lifecycle item | | 2026-08-03 | Recover automatic monthly publication | User-authorized detached `monthly_reports.worker` start consumed pending outbox events 15–20 in order. July V05 (`as_of_date=2026-07-27`, 987 rows) and active August V01 (`as_of_date=2026-08-01`, 111 rows) are registered with workbook/result artifacts; all six checked daily-commit events are `published`, the XLSX passes ZIP integrity, and Web health remains ready. Re-upload and source-code changes were not needed; reboot-persistent supervision remains open | Current state, daily-to-monthly evidence topic/index, stale supervision item, scoped planning record | | 2026-08-03 | Review monthly worker logging and monitoring | Confirmed Screen/stdout and Web/stderr are not durable monitoring, `/healthz` excludes worker liveness, and the existing outbox/task trace lacks heartbeat and monthly-specific end-to-end wording. Prepared a privacy-minimized structured-log, heartbeat, status and supervisor/alert recommendation; no code or runtime change was made | Monthly worker observability evidence/index, stale item, scoped planning record | | 2026-08-03 | Diagnose company-report source label after subset Excel activation | Read-only checks found accepted current Booking Excel batch 6 with 73 rows and no open draft; latest August jobs were created after activation but saved `source: null` because the live Web process predates the source-traceability code. The label is a metadata/runtime mismatch, not proof that the report used the old source; no restart or backfill was performed | Current state/evidence topic/index, stale item, scoped planning record | | 2026-08-03 | Diagnose subset-source 2026-08 `01-10` publication failures | Batch 7 is accepted/current with 72 rows and no review draft. The latest job built all five company row sets but failed all at `publish` with `COMPANY_REPORT_PUBLISH_FAILED`; the live 8766 process predates both source metadata and current duplicate-publication fixes. No restart or rerun was performed | Current state/evidence topic/index, stale item, scoped planning record | | 2026-08-03 | Evaluate Daily task trace for company-report publication failure | Confirmed the supplied Daily trace only covers successful Finance commit and outbox publication; it lacks company-report job linkage and publish-stage detail, shows unknown execution metadata and prints an unmasked full source hash. Recommended separate trace scopes, runtime identity and hash masking; no code/runtime change was made | Daily/company trace evidence/index, stale item, scoped planning record | | 2026-08-03 | Diagnose Daily Report uploaded but monthly report not updated | Read-only database/runtime inspection confirms Daily run 39 committed successfully as Finance version 14 with 111 retained rows for 2026-08-01, but outbox event 20 remains pending with zero attempts because no independent `monthly_reports.worker` process is running. Monthly history still ends at July V04; no August version exists. No restart, rerun, upload or database write was performed | Current state, daily-to-monthly diagnosis evidence/index, scoped planning record | | 2026-08-03 | Make the mobile H5 dashboard publicly readable | Added public H5 shell/assets and purpose-built sanitized aggregate month/analytics endpoints; desktop, generic APIs, legacy H5 APIs, detailed health, jobs/traces, downloads and writes remain protected. Anonymous H5 loading plus authenticated compatibility is covered by 71 Web tests and syntax checks; no live restart or deployment occurred | Current state/history, architecture, business rules, ADR-005, H5 public-access evidence/index, scoped planning record | | 2026-08-03 | Clarify ARR trace semantics for internet deployment | Added additive execution-scope, processor-mode and remote-dispatch fields; replaced misleading “本地处理” copy and clarified that a pending downstream event follows a completed Finance commit. Existing delivery IDs/trace fields remain compatible; 27 trace/Web tests plus Python/JavaScript syntax and diff checks pass, with no live mutation | Current state/history, ARR trace-semantics evidence/index, scoped planning record | | 2026-08-03 | Add Booking Excel to company-report traceability | New company-report jobs store the server-captured active source summary; the page shows the current source, job detail/history show the source Excel, and identical active uploads become an informational refresh instead of a generic extraction error. Old jobs remain compatible without source metadata. Focused Web/company tests and the 360-test suite pass with 10 optional skips; no live mutation or restart was performed | Current state, source-to-report traceability evidence/index, scoped planning record | | 2026-08-03 | Fix duplicate company-report publication | Made same-reservation/same-semantic retries reuse the first validated archive/result identity even when a rebuilt XLSX has different binary bytes. Partial, corrupt or semantic-conflict states fail closed; an existing current file is preserved and a missing one can be repaired from the archive. Publisher tests pass 6/6, company-report tests pass 32 with five optional ArtifactTool skips, Web company/trace tests pass 13/13 and compilation is clean. No live rerun or business-data mutation was performed | Current state, company-report retry evidence/index, scoped plan | | 2026-08-03 | Diagnose 2026-07 company-report `正式表格发布失败` | Found the historical `11-20` retry failed for all five companies at publication after an earlier same-period success. A read-only double-build probe showed identical semantic workbook identities but different binary XLSX SHA-256 values; the immutable archive/result identity rejects that retry. No code, report, database or output state was changed | Current state, company-report retry evidence/index | | 2026-08-02 | Restore prior-month history across Daily Report, monthly processing and company-channel detail | Added a read-only merged history-month count endpoint and three independent month navigators with latest-non-empty defaults, month-aware empty/pagination states and Chinese/English/Thai responsive copy. Company generation/history months are separate and monthly polling follows only the viewing month. A live read confirms July 30/4/4 records, 356 tests pass, isolated 1440/900/390 QA is overflow-free, and the restarted 8766 runtime is ready without business writes | Current state/history, history-visibility evidence/index, stale item, scoped planning record | | 2026-08-02 | Diagnose missing prior-month history and design its display | Proved the data was retained: July has 30 daily jobs, 4 monthly publications and 4 company jobs, while the August-default frontend view is empty. Daily/monthly loaders hard-code the Bangkok current month; company history hides its month filtering inside generation setup. Proposed visible per-history month navigation, recent-record empty states and separation of company generation/history months; no product code, runtime or business data changed | History-visibility evidence/index, stale item, scoped planning record | | 2026-07-31 | Tighten Channel BI top spacing | Raised the desktop BI panel by 20px toward the four-tab bar and applied a lighter 10px mobile adjustment. Other panels, tab behavior and BI data are unchanged; JavaScript syntax and 39 focused Web tests pass | Current state/history, Channel BI utility evidence | | 2026-07-31 | Quiet the Channel BI header utilities | Removed the visible BI page heading and ready-state `数据库已连接` copy, compressed the desktop/H5 month selector, and restyled task-log/logout as low-emphasis links while preserving click behavior. JavaScript syntax plus focused BI/daily/task-log/auth tests pass; no API or business data changed | Current state/history, Channel BI utility evidence/index | | 2026-07-31 | Remove BI labels and add actual data coverage | Removed CHANNEL PERFORMANCE, the BI snapshot watermark and visible BI TOTAL PRICE labels on desktop/H5. Added localized 数据范围 below each company-sales title, backed by additive min_arrival_date plus existing max_arrival_date values from the same read-only analytics snapshot. JavaScript syntax and focused analytics/Web/UI tests pass; no Finance/report business data changed | Current state/history, Channel BI evidence/index, channel-analytics README | | 2026-07-31 | Restart ARR Web after Web i18n implementation | Replaced the stale port-8766 process under detached Screen `arr2-web-8766` with the current source launcher at 19:27:42 +08. Loopback and current LAN `192.168.3.103` return the expected anonymous root redirect, `/login` 200, `/healthz` 200 and `/assets/i18n.js` 200; the prior `.48` address is no longer assigned to this workstation. No upload, report generation, download or business-data mutation occurred | Current state/history, i18n implementation evidence/index, stale-items | | 2026-07-31 | Rotate the ARR Web login credentials | Updated the two existing macOS Keychain-backed runtime values without storing them in source or process arguments, normalized the password item's account metadata and performed one controlled port-8766 restart under detached Screen. The prior pair returns 401, the new pair passes session/cookie/CSRF/logout plus desktop/H5 and all six readiness flags, and loopback/current LAN health return 200. Two read-only snapshots stayed at 30 daily jobs, 4 monthly versions and 4 company jobs; latest business records predate restart, nine focused tests pass and literal/process scans are clean. The requested password still equals the username, so the strength follow-up remains open | Current state/history, login-runtime evidence/index, stale items, commitments, scoped planning record | | 2026-07-31 | Allow early company-channel report generation and rename period states | Removed the old time-release gate from company-channel generation. Current-month incomplete periods now generate from the current committed Finance snapshot with the existing fixed C/O cutoff; historical months can rerun, while future months remain blocked. Replaced the permission-oriented state copy with `周期未结束` / `周期已结束` and added a confirmation warning that later data requires rerun. `node --check`, Python compilation, HTML parsing, 28 focused tests and the project-venv full discovery of 348 tests with 10 skips pass; no report or business data was generated | Business rules, current state/history, evidence topic/index, scoped planning record | | 2026-07-31 | Simplify company-channel period card labels | Removed the visible `第一期`/`第二期`/`第三期` copy and changed the three card headlines to `C/O:01-10`, `C/O:11-20`, plus a month-aware final range (`C/O:21-30` or `C/O:21-31`). Release status and opening time remain visible; internal period keys and generation requests are unchanged. JavaScript/HTML checks, 28 focused tests, 348-test discovery and isolated 1280×720/390×844 browser QA pass with no overflow or page-console warnings | Current state/history, module map, company-period evidence/index | | 2026-07-31 | Simplify company report result details | Collapsed duplicate review problems by type/code/period; replaced the user-facing `版本` column with `生成时间` from job completion time, with creation-time fallback. Internal `version_no` API data remains unchanged. JavaScript/HTML checks, 28 focused tests and targeted deduplication execution pass | Current state/history, module map, company-period evidence/index | | 2026-07-31 | Recompose company-channel report cards and replace native generation confirmation | Placed the Excel source and three C/O periods in one responsive desktop card row, moved the compact visually unlabeled month picker to the setup card's upper-right, shortened all period CTAs to `生成`, and replaced the browser-native confirm with an accessible in-page dialog supporting cancel, backdrop and Escape dismissal. Existing generation payload/polling and business behavior remain unchanged. JavaScript/HTML checks, 28 focused tests, 348-test discovery and isolated 1280×720/390×844 QA pass with no overflow or console warnings. Shared port 8766 restarted at 14:26:56 +08 and `/healthz` is `ready` | Current state/history, module map, company-detail evidence/index, scoped planning record | | 2026-07-31 | Rebalance company-channel title and upload rail | Moved the fixed five-company context beside `公司渠道明细` as pale helper text, removed the duplicate generator scope block, and bounded the Excel upload action to a 760px desktop rail with a full-width mobile fallback. Kept `报表月份` and `刷新任务` behavior intact, adding a read-only refresh tooltip. JavaScript/HTML checks, 28 focused tests, 348-test discovery and isolated 1280x720/390x844 QA pass with no overflow or console warnings | Current state, module map, company-detail evidence/index, scoped planning record | | 2026-07-31 | Compress the daily overview cards to one-third height | Reduced the desktop upload card's internal spacing and changed its dropzone to a compact horizontal icon-and-copy layout. The upload card and three KPI cards now share a compact equal grid-row height, while the mobile upload layout remains unchanged. JavaScript syntax and 20 focused Web/static/trace tests pass; no upload/API/processing behavior changed | Current state/history, KPI-card evidence/index | | 2026-07-31 | Compact company-channel action buttons | Reduced the three generation CTAs to a centered 104–124px width family inside their period cards and made `提取并核对` a matching 42px centered button. Labels remain one line with active/focus states intact; no upload, extraction, report or database behavior changed. JavaScript/HTML checks, 28 focused tests, 348-test discovery and isolated 1280×720/390×844 browser geometry checks pass with no overflow or console warnings. Port 8766 restarted at 13:37:49 +08 | Current state/history, company-action visual evidence, scoped planning record | | 2026-07-31 | Match daily overview card heights | Restored shared grid-row stretching so the ARR.XML upload panel and ARRIVAL DATE, processing duration and NO. OF ROOM cards have identical desktop heights. KPI content stays vertically centered, mobile stacking is unchanged, and no upload/API/processing behavior changed. JavaScript syntax and 20 focused Web/static/trace tests pass | Current state/history, KPI-card evidence/index | | 2026-07-31 | Revert KPI width shrink and fit card height to content | Restored the original grid-column widths for ARRIVAL DATE, processing duration and NO. OF ROOM. Their height is now content-sized with the existing shared-row centering, while the upload module and desktop row remain unchanged. JavaScript syntax and 20 focused Web/static/trace tests pass; no upload, API or processing behavior changed | Current state/history, KPI-card evidence/index | | 2026-07-31 | Fit daily KPI card widths to content | Set ARRIVAL DATE, processing duration and NO. OF ROOM cards to intrinsic content width, centered within their existing metric columns while preserving the upload module, 270px height and desktop row. JavaScript syntax and 20 focused Web/static/trace tests pass; no upload, API or processing behavior changed | Current state/history, KPI-card evidence/index | | 2026-07-31 | Center the shortened daily KPI cards | Vertically centered the shortened ARRIVAL DATE, processing duration and NO. OF ROOM cards within the upload module's shared desktop grid row. Their widths, 270px height, smaller decorative ring and mobile fallback remain unchanged. JavaScript syntax and 20 focused Web/static/trace tests pass; no upload, API or processing behavior changed | Current state/history, KPI-card evidence/index | | 2026-07-31 | Tighten the daily KPI cards | Removed the percentage-based height inheritance that stretched ARRIVAL DATE, processing duration and NO. OF ROOM to the upload panel height. The three cards retain their widths, use a compact 270px desktop height with a smaller decorative ring, and remain content-sized on narrow screens. JavaScript syntax and 20 focused Web/static/trace tests pass; no upload, API or processing behavior changed | Current state/history, KPI-card evidence/index | | 2026-07-31 | Add a monthly processing heading | Added the requested `月报处理` heading to the top of the monthly download list, paired with the existing live-update state without changing table columns, pagination, polling or data behavior | Current state/history, monthly-page evidence/index | | 2026-07-31 | Recompose the daily report overview | Removed the duplicate top `Daily Report` heading and `THIS MONTH` eyebrow, renamed the history heading to `Daily Report`, and placed the ARR.XML upload station with the ARRIVAL DATE, processing-duration and NO. OF ROOM cards in one responsive desktop row. Existing upload/progress/task-log behavior is unchanged. JavaScript syntax and 20 focused Web/static/trace tests pass; no API or processing behavior changed | Current state/history, daily overview layout evidence/index | | 2026-07-31 | Simplify the standard monthly report page | Removed the redundant standard-monthly heading, `VERSION HISTORY`, version-record title, visible monthly `版本` column and C/O-period footer note. Renamed the navigation item to `月报`, kept 50-row polling/pagination and API version ordering, and made `更新至` render the explicit maximum-ARRIVAL field with an `as_of_date` compatibility fallback. Added restrained live-status/table spacing; 32 focused Web/schema/task-log tests plus JavaScript/Python syntax checks pass. No report or business data changed | Current state/history, monthly-page evidence/index, scoped planning record | | 2026-07-31 | Keep ARR.XML upload on the daily page and add progress feedback | Removed the automatic task-log popup after upload. Added an accessible inline progress bar with approximate upload, processor, validation and database stages, success/error states and mobile spacing. Manual header and history-row log access remain unchanged. `node --check`, five task-log/progress tests, two static Web tests and eight trace/repository tests pass; no API or processing behavior changed | Current state/history, daily upload evidence/index | | 2026-07-31 | Attach Booking extraction records to their uploaded filename | Removed the separate accepted/historical-source status and summary from the company page. The open review now shows its draft's validated uploaded filename directly below `Booking记录提取`, clears it with the draft and wraps long names on 390px screens. JavaScript/HTML checks, 36 focused tests and the 346-test discovery pass with 10 expected skips; isolated desktop/mobile QA found no overflow or console errors and performed no mutation. Port 8766 restarted at 12:43 +08 | Current state/history, Booking evidence/index, business rules, module map, scoped planning record | | 2026-07-31 | Freeze and save the Markdown company-channel test baseline | Created a read-only, non-publishing acceptance package bound to the exact Markdown/source-batch hash, processor/rule identity and five Finance version pins. Generated/reopened/value-checked five XLSX files and visually reviewed all 15 sheets. All 314 rows match an independent Markdown aggregation: 27 Booking Room values filled, 287 blank, zero mismatches and zero company errors. SHA-256 verification covers every retained file; the open Excel draft and active Booking batch were unchanged | Current state/history, new Markdown baseline evidence/index, stale item, scoped planning record | | 2026-07-31 | Add Booking review multi-select and an in-page delete dialog | Added row/all-visible selection for 50-record pages, count-aware single/batch confirmation, explicit mouse/Escape cancellation and one strict 1-50-item atomic soft-delete API while preserving the item route. Removed the requested review/helper/source metadata copy so the source summary exposes only the uploaded filename. Focused suites and 346-test discovery pass with 10 expected skips; isolated desktop/390px browser QA selected 1/2/50 rows, showed no native prompt/overflow/console errors and submitted no deletion. Port 8766 restarted on the final composition at 12:22 +08 | Web README, business rules, data flow/module map, current state/history, Booking extraction evidence/index, scoped planning record | | 2026-07-31 | Define Booking review end-to-end acceptance boundary | Confirmed the company-channel processor reads current Booking views, current July data is valid 5/5 and the expanded Booking/company/XLSX suite passes 55/55. A real-PostgreSQL draft/edit/activation slice now passes under an outer rollback. Remaining work is one operator-authorized complete-workbook replacement and a released populated period; July month-end opens 2026-08-01 00:00 Bangkok | Current state/history, extraction/company evidence/index, stale items, scoped planning record | | 2026-07-31 | Build the raw Booking Excel extraction program | Added deterministic Tour Code/`โรงแรม` parsing, agreed TWN/DBL normalization, last-row/cancellation rules, quantity-preserving manual review, editable/deletable durable drafts, zero-pending atomic activation, upload-first responsive UI and real PATCH/DELETE HTTP transport. The supplied workbook yields 26 codes/37 items/7 pending and both named examples match. Migrations 014/015 are applied; a real-PostgreSQL create/edit/activate slice rolled back cleanly; 343 tests and authenticated browser QA pass; port 8766 runs the new composition with all readiness flags true and the original business source unchanged | Root/schema docs, business rules, data flow/module map, current state/history, extraction evidence/index, reflection/index, stale items, scoped planning record | | 2026-07-31 | Audit whether Booking DB supports parser 2.0 human review | Initial snapshot found a coarse row gate, no review transport and no repository acceptance. The later extraction-program task applied 014/015, added PATCH/DELETE, passed a real-PostgreSQL transaction rollback slice and restarted the runtime. The remaining audit finding is that the latest-state draft model has no actor/reason/revision history | Current state/history, Booking review evidence/index, data flow/module map, stale items, migration record, scoped planning record | | 2026-07-31 | Audit current database content and manual Booking import dimensions | Read-only snapshots found one 867-row/348-code Booking fixture and 417 active Finance rows: 121 matched, 285 missing-code and 11 unmatched. `Group Code + room type + quantity` is sufficient under a global-code invariant. The initial snapshot found migration 014 absent and parser/importer drift; the later manual-review audit superseded deployment status by observing concurrent 014/015 application | Current state/history, business rules, Booking data-flow/module map, evidence/index, stale items, applied-migration record, scoped planning record | | 2026-07-31 | Simplify the ARR login page copy and hierarchy | Replaced the left marketing narrative with one `ARR Report` heading, removed the duplicate top-left brand, workflow steps, welcome/access copy and help/footer disclaimers, and changed field labels to `username`/`password`. Authentication behavior remains unchanged. JavaScript syntax, 33 focused tests and live 390x844/1280x720 checks passed with no overflow or browser logs | Current state/history, login-runtime evidence/index | | 2026-07-31 | Restore access after another reported page failure | Confirmed the authenticated 8766 runtime and detached Screen process were healthy: loopback/LAN root redirect to login and health/login return 200. The failure was a DHCP address change from `.103` back to `.48`, not a service outage. Opened the working loopback login gateway in the in-app browser and recorded `http://192.168.3.48:8766/` as the current LAN entry; no runtime or business data changed | Current state, runtime-mismatch evidence/index, stale items | | 2026-07-30 | Activate the ARR application login on port 8766 | Stored both Web credential values in separate Keychain items, added a mode-0700 credential-free local launcher, restored the prior controlled database/OSS/report composition under detached Screen and verified loopback/LAN login. Anonymous root/API gating, hardened session/CSRF, desktop/H5/history reads, all five readiness flags and logout revocation passed; live totals remained 24/4/3 and no business job or worker was started | Current state/history, login-runtime evidence/index, stale items, commitments, mixed-runtime reflection, scoped activation plan | | 2026-07-30 | Recheck the complete ARR page outage after login work | Found no process or listener on 8766: loopback and current-LAN root/login/health/static probes are refused, old PID 37865 is gone, and no auto-restart service exists. The Wi-Fi address also changed from `.48` to `.103`. Available evidence cannot prove login work caused the process exit; it does prove current login-enabled source cannot start without operator-selected credentials. No runtime or business-data mutation was made | Current state, runtime-mismatch evidence/index, stale items | | 2026-07-30 | Polish the Daily Report title, task-log utility and XML upload area | Rebalanced the workspace hierarchy so ARR Report outranks Daily Report, styled task log as a real 13px outlined button, centered and simplified the responsive upload station, removed the numbered/retention labels and reduced the primary action to a compact control. JavaScript syntax, 33 focused tests and live 375/768/1024/1440 checks passed with no overflow or browser issues | Current state, daily visual-polish evidence/index, scoped planning record | | 2026-07-30 | Expand blank Booking Room fallback to unmatched Group Codes | Bumped the company-report processor to 1.2.0. A present consistent Group Code now retains its stay-segment/pricing row but leaves Booking Room blank when no accepted room can resolve; missing codes remain separate blank rows and Finance validation stays strict. A repeatable-read July 31 preview is valid 5/5 and 37 focused/real-XLSX/Web-coordinator tests passed with three expected skips. No data/report mutation occurred; the later port-8766 activation row records runtime loading | Business rules, current state, company-report readiness evidence/index, stale items, company-report README, scoped planning record | | 2026-07-30 | Add an application login page and protect the ARR portal | Added fail-closed environment credentials, bounded login attempts, random authenticated sessions/CSRF, protected desktop/H5/API/upload/trace/download routes, revoking logout, safe return targets, no-detail `/healthz`, a responsive accessible login UI and Caddy HTTPS-only deployment. Final focused tests pass 33/33; the 317-test full suite is green; isolated browser checks pass all login/logout states and four responsive widths. Activation was intentionally deferred at source completion and is recorded by the later port-8766 activation row | Root/Web/deploy runbooks, success criteria, architecture/data flow/module map, business rules, current state/history, login-runtime evidence/index, reflection/index, stale items, commitments, scoped planning record | | 2026-07-30 | Diagnose the reported unavailable ARR page | Proved the service was not generally down: loopback/LAN root, H5, health and JavaScript return HTTP 200, and a fresh root browser session has zero warnings/errors. `/login` alone is 404 because the long-lived process predates the login routes while serving newer static files. Opened the working root for the user and withheld an unsafe restart because required operator-selected login credentials are absent | Current state, runtime-mismatch evidence/index, scoped planning record | | 2026-07-30 | Show the uploaded XML filename instead of internal `source.xml` in daily history | Added/applied migration 013 and separated run-level upload provenance from canonical artifact identity. History/trace now use only the uploaded basename; pre-013 rows render `—`. A rolled-back live DB probe and 312-test suite passed. The later port-8766 activation row resolves the credential/restart gate; one no-PII write-path check remains | Root/Web/migration runbooks, data flow/module map, business rules, current state, evidence/index, stale items, scoped planning record | | 2026-07-30 | Move the daily task log into the former mobile-dashboard header utility | Replaced the desktop `手机看板` link with a visible, focusable `任务日志` trigger and moved the sole black console out of the 日报处理 layout into a native modal. Upload and mouse/keyboard history selection open the matching job; polling runs only while the modal is open. SQL proof confirms the console is limited to one `opera_daily` job and its linked attempts, deliveries/submissions, Finance daily versions and outbox facts—not global, monthly-run or company-report logs. JavaScript syntax, 12 focused tests and live 1440×900/375×812 checks passed with zero browser warnings/errors; the broader legacy Web test class remains blocked by separate in-progress login-contract drift | Current state, task-log relocation evidence/index, scoped planning record | | 2026-07-30 | Add 50-row pagination to every monthly history list | Daily, monthly and selected-month company histories now request 50 rows per page and show exact total/range, page number and previous/next controls. Backend totals and page rows share one consistent snapshot/lock, old array-shaped API data remains compatible, monthly polling reconciles new publications back to page 1, and desktop/390-pixel live checks passed | Current state, module map, stale items, planning record | | 2026-07-30 | Accept blank Booking Room when company detail has no Group Code | Confirmed the supplied 867-row/348-code Markdown is valid but already imported under the same hash. Changed the company-report rule so every no-code Finance fact remains a separate row with blank RES_COMMENT/Booking Room and no false duplicate/warning. Four July companies now preview valid; LianTai still has two present-but-unmatched codes. Focused tests and real XLSX export/reopen/render checks passed; no database or report mutation occurred | Business rules, current state, company-report readiness evidence/index, stale items, company-report README | | 2026-07-30 | Enable the phone Channel BI dashboard on the current LAN | Restarted the validated ARR2 Web process from loopback-only to `0.0.0.0:8766` with the same controlled database, Keychain-backed OSS and report-generation configuration. Both `127.0.0.1` and `192.168.3.48` returned HTTP 200 for `/h5`; LAN health kept all readiness flags true and the analytics endpoint returned HTTP 200. The full portal, including upload controls, is now reachable from the trusted Wi-Fi | Current state | | 2026-07-30 | Simplify ARR Report branding/copy and audit page display bounds | Replaced desktop/H5 header marks with plain `ARR Report`, changed the daily content heading to `Daily Report`, and removed the specified daily/monthly explanatory copy without changing automatic publication. Static scans, JavaScript syntax, 22 Web regressions and live desktop/monthly/390×844 H5 checks passed. Audited the current UI: daily/monthly/company history silently cap at 100 without pagination; BI renders uncapped aggregates, not detail rows | Current state, stale items, planning record | | 2026-07-30 | Reconcile the user's 416-room correction | Confirmed the user was right about the total: 07-23 committed after the prior snapshot and four real sources now sum to 416. Hash matching and isolated replay prove `0720.XML=100` and `0722.XML=88`, so those two day labels were reversed. Live API/monthly V04 show 417 due solely to the fixture; an open BI view can separately remain stale at 308 because it does not refresh after upload. No business state changed | Current state, BI evidence/index, stale items, planning record | | 2026-07-30 | Reconcile V01's claimed 2026-07-21 watermark | Proved the user is operationally correct: V01's OSS source has 119 rows all arriving 07-21. Its database lineage and hash-matched workbook also contain one 07-27 `local_fixture` row, so the persisted 7.27 label is contaminated content rather than a metadata-only error. No database/report state changed | Current state, BI contamination evidence, stale items, planning record | | 2026-07-30 | Diagnose wrong-looking Channel BI values after data update | Proved BI reads current retained PostgreSQL facts and its aggregation code is green, but an accepted 07-27 `local_fixture` remained current. It contaminates BI/monthly V03 by +1 room, +3 room-nights, +5,400 and a false 7.27 watermark; also found `公司数` is actually worksheet-channel count. No database state changed | Current state, BI contamination evidence/index, prior BI/monthly evidence caveats, stale items, reflection, planning record | | 2026-07-30 | Make published monthly versions appear without manual refresh | Removed the refresh control and added a four-second, visible-tab-only, non-overlapping list poll with immediate resume and last-good-state retention. Browser/access-log verification showed real repeated reads and current V03/V02/V01 downloads; latest included ARRIVAL remains the “更新至” authority | ADR-001/index, success criteria, data flow/module map, business rules, current state/evidence/reflection, root/Web runbooks | | 2026-07-30 | Complete monthly publication, page visibility/download, automatic dispatch and formulas | Applied metadata-only migration 012; derived “更新至” from max included ARRIVAL; added durable idempotent report activation, real list/download, exact TOTAL PRICE formulas and a dedicated reliable worker. Two pending live events resolved to one active 120-row report ID 1/version 1 and both were acknowledged only after publication | ADR-001/index, architecture, business rules, current state, evidence/reflection, stale items, migration/root/Web/monthly/deploy runbooks | | 2026-07-30 | Trace first live ARR2 daily and monthly user run | Proved the daily result was atomically committed as active Finance version 4 with 119 retained rows and a pending downstream event. Proved the manual monthly action generated a valid 120-row local XLSX but no database report metadata or Web-download identity, because ARR2 has no `finance.report_versions` and its monthly list is synthetic `source_ready` data | Current state, live-run evidence/index, stale items, planning record | | 2026-07-30 | Build independent ARR2.0 programmatic XML ingestion | Copied a filtered source snapshot without touching ARR1; replaced Agent/MCP transport with local fixed processing, private immutable artifacts, independent validation and atomic ingestion; removed active callback/trace/deployment dependencies; added lifecycle/download/vertical-slice coverage and updated project memory | ADR-004, positioning, architecture, current state, evidence, reflection, commitments, stale items, runbooks | | 2026-07-30 | Analyze first successful XML fetch/Skill/MCP run | Confirmed one exact fetch and one deterministic Skill run produced 135 records/119 output rows, followed by repeated large-file rereads and one MCP submission containing only 20 records. ARR rejected it as `RESULT_CONTRACT_INVALID`, wrote zero Finance versions and terminalized the job. XML allowlisting and MCP reachability are proven; reliable large-payload transfer is now the blocker | Current state, fetch evidence/index | | 2026-07-30 | Diagnose frozen log that still displays RUNNING | Proved the four-second UI refresh is working but the task is no longer executing: SuperAgent completed and the trace stream ended, while ARR run/attempt remained `running` with no MCP submission or Finance write. The production upload lifecycle has no terminal poll/reconciler, PostgreSQL cannot persist `delivery_missing`, and grant expiry is not scheduled to close this case. No task state, service or remote run was mutated | Current state, fetch evidence/index, task-log evidence, stale items, planning record | | 2026-07-30 | Analyze first true PROGRAM_INPUT v3 controlled run | Confirmed one HTTPS fetch call, no retry/bypass and a sole `extension_not_allowed` Tool result. Anonymous HEAD proved the public source URL/ACL and exact object identity. Skill/MCP did not run; the failure object was Profile-invalid and ARR remained running after remote completion, exposing a separate finalization defect | Current state, fetch evidence/index | | 2026-07-30 | Reload local ARR with PROGRAM_INPUT v3 | Proved the prior job was generated by a stale v2 Web process, stopped only the validated 8765 listener, and restarted it through the controlled Keychain-backed launcher. PID 10376 now serves the updated source with all readiness flags true; a new job is still required for SuperAgent/MCP verification | Current state, local-runtime evidence, fetch experiment evidence | | 2026-07-30 | Replace credential-backed/`oss://` fetch with ARR-generated public OSS URL | Added PROGRAM_INPUT v3 `oss.url`, exact HTTPS pass-through Prompt, percent-encoded key handling and ACL/readiness alignment. Only committed source XML is public-read; staging and outputs remain private. Forty-four targeted and 276 full-suite tests pass (2 skipped); SuperAgent republish, XML allowlist and live MCP/Finance proof remain external | ADR-003, processing/storage/integration READMEs, architecture, current state, fetch evidence, stale-item resolution, planning record | | 2026-07-30 | Add one-click copy for the full task log | Added one plain button that copies the current black console's full `textContent`, with Clipboard API plus selected-textarea fallback, disabled/loading state and existing toast feedback. JavaScript syntax, 15 Web tests and live 8765 button behavior passed with zero console warnings/errors; browser clipboard isolation prevented external pasteback comparison | Web README, current state, task-log evidence, planning record | | 2026-07-29 | Add real SuperAgent execution trace to the plain task-log console | Replaced production non-stream submit with one `include_trace=true` stream, returned on `run.started`, drained the same connection in the background, persisted only sanitized run/task/step/end JSONL and merged it with authoritative ARR facts. Verified POST-only/non-replay semantics, blocked ambiguous automatic retries, passed a 45-event live handoff probe, 38 targeted tests and the 275-test full suite (2 skipped). Existing pre-change jobs remain DB-only because trace cannot be replayed | Agent/Web/processing READMEs, architecture/data flow/module map, current state, evidence/index, planning record | | 2026-07-29 | Replace processing status with a full-flow raw task log | Added a privacy-minimized trace API over persisted run/attempt/result/Finance/outbox facts and logical ordering for equal timestamps; after user feedback, reduced the frontend to one black monospace `
` with one event per line, task switching, polling and refresh. Real running/success/failure states, mobile containment, zero console errors, 20 targeted tests and 269 full-suite tests passed (2 skipped) | Web README, architecture/data flow, current state, evidence/index, planning record |
| 2026-07-29 | Fix repeated XML upload source identity failure | Found that content-hash artifact deduplication reused an older run's job-scoped OSS key. Added/applied migration 011 and storage-identity lookup; 57 targeted and 269 full-suite tests pass. A real equal-content upload then reached SuperAgent under a new object identity, but remote success produced no MCP submission and no Finance write, so exported run events are the next blocker | Migration ledger, current state, repeated-upload evidence/index, memory index, planning record |
| 2026-07-29 | Reduce the dedicated Agent Prompt to controlled orchestration | After the user clarified that only the fixed business-system entrypoint can invoke this Agent, removed redundant input gates and reduced the Prompt from 6,874 to 1,321 characters. ARR code, Skill and MCP retain authoritative validation; Prompt performs only one fetch/process/submit/output cycle. Twelve targeted tests pass; platform publication remains external | ADR-002, architecture, current state, manual-run evidence, planning record |
| 2026-07-29 | Analyze exported SuperAgent manual XML run | Confirmed the daily Skill completed deterministically, but the run had no PROGRAM_INPUT, OSS fetch, submission grant, MCP call, receipt, or database evidence; its acceptance of chat upload and use of `present_files` prove the active Profile behavior does not match the required full Main Prompt | Current state, manual-run evidence/index, runtime-target reflection/index, planning record |
| 2026-07-29 | Verify current Web “渠道BI” database connectivity | Confirmed the complete browser → Web API → PostgreSQL read path against the running 8765 instance: health and live analytics passed, the page rendered the matching 2026-07 QBD metrics with zero console errors, and 24 targeted tests passed. No connection code change was needed; the all-interface local listener was recorded as a deployment-boundary risk | Current state, BI runtime evidence/index, planning record |
| 2026-07-29 | Open XML processing in the Docker image and current local Web entry | Added `--enable-processing` to Dockerfile CMD so direct image launches match Compose; updated/restarted the controlled local launchd entry and verified database/processing health plus an enabled XML file chooser; kept source CLI/runtime readiness fail-closed; passed 260 tests with 2 expected skips; pushed code commit `ad3d987` and verified the remote branch | README/runbook, current state, architecture module map, deployment and local-runtime evidence/index, container-entry reflection, planning record |
| 2026-07-29 | Prepare and publish the project for controlled public-server deployment | Added Docker/Compose/Caddy deployment with XML processing explicitly enabled, HTTPS Secure cookies, Basic Auth/Bearer boundaries and a Chinese runbook; sanitized publishable history; 259 tests passed (2 skipped), all contracts/checksums and a 271-file secret/size/symlink scan passed; pushed `main` to the self-hosted repository and verified initial deployment commit `a701de9` | Current state, architecture, deployment evidence/index, commitments, module map |
| 2026-07-29 | Restart the controlled ARR MCP public path | Restarted loopback MCP and fixed ngrok host; corrected exact public Host allowlisting after a diagnostic 421; public unauthorized requests now return 401 and authenticated one-tool discovery returns 200. Main upload remains disabled | Current state, E2E evidence/index, commitment, active planning record |
| 2026-07-29 | Diagnose persistent SuperAgent MCP `failed` status | Confirmed the temporary MCP and ngrok processes had exited; public `/mcp` returns `ERR_NGROK_3200 endpoint offline` despite valid DNS/TLS. The stale platform config version 33 remains a second-stage issue after reachability is restored | Current state, E2E evidence/index, commitment, active planning record |
| 2026-07-29 | Open XML upload in a controlled boundary and execute a real no-PII vertical slice | UI upload, OSS registration and SuperAgent dispatch passed; SuperAgent returned success without calling MCP because platform tool discovery remained at config version 33. Test run was failed safely, grant revoked, zero Finance writes verified, and temporary upload closed | Current state, evidence topic/index, commitments, planning record |
| 2026-07-29 | Clear incorrect monthly-report memory and record the user's final corrections | Replaced manual-input/button assumptions with automatic post-commit triggering; confirmed the required `TOTAL PRICE` formula; no product code changed | Project positioning, ADR-001, architecture, current state, business rules, stale items, monthly audit planning notes |

## Notes

Keep entries concise. Move durable rationale to ADRs and durable rules to the appropriate higher-level document.