nexscope-cli 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. nexscope_cli-0.1.0/ACCEPTANCE.md +525 -0
  2. nexscope_cli-0.1.0/ASSET-NOTICES.md +9 -0
  3. nexscope_cli-0.1.0/LICENSE +202 -0
  4. nexscope_cli-0.1.0/MANIFEST.in +6 -0
  5. nexscope_cli-0.1.0/NOTICE +20 -0
  6. nexscope_cli-0.1.0/PKG-INFO +257 -0
  7. nexscope_cli-0.1.0/README.md +217 -0
  8. nexscope_cli-0.1.0/THIRD-PARTY-NOTICES.md +27 -0
  9. nexscope_cli-0.1.0/cli/nexscope_cli/__init__.py +4 -0
  10. nexscope_cli-0.1.0/cli/nexscope_cli/api-contract.json +37 -0
  11. nexscope_cli-0.1.0/cli/nexscope_cli/capabilities/__init__.py +3 -0
  12. nexscope_cli-0.1.0/cli/nexscope_cli/capabilities/catalog.py +73 -0
  13. nexscope_cli-0.1.0/cli/nexscope_cli/capabilities/mock.py +53 -0
  14. nexscope_cli-0.1.0/cli/nexscope_cli/capabilities/plan.py +142 -0
  15. nexscope_cli-0.1.0/cli/nexscope_cli/catalog.json +69 -0
  16. nexscope_cli-0.1.0/cli/nexscope_cli/compat/__init__.py +4 -0
  17. nexscope_cli-0.1.0/cli/nexscope_cli/compat/legacy.py +143 -0
  18. nexscope_cli-0.1.0/cli/nexscope_cli/core/__init__.py +3 -0
  19. nexscope_cli-0.1.0/cli/nexscope_cli/core/auth.py +81 -0
  20. nexscope_cli-0.1.0/cli/nexscope_cli/core/datasets.py +305 -0
  21. nexscope_cli-0.1.0/cli/nexscope_cli/core/errors.py +11 -0
  22. nexscope_cli-0.1.0/cli/nexscope_cli/core/evidence.py +134 -0
  23. nexscope_cli-0.1.0/cli/nexscope_cli/core/execution.py +171 -0
  24. nexscope_cli-0.1.0/cli/nexscope_cli/core/remote.py +22 -0
  25. nexscope_cli-0.1.0/cli/nexscope_cli/core/transport.py +61 -0
  26. nexscope_cli-0.1.0/cli/nexscope_cli/dependencies.lock +282 -0
  27. nexscope_cli-0.1.0/cli/nexscope_cli/dependency-lock.json +371 -0
  28. nexscope_cli-0.1.0/cli/nexscope_cli/doctor.py +136 -0
  29. nexscope_cli-0.1.0/cli/nexscope_cli/main.py +313 -0
  30. nexscope_cli-0.1.0/cli/nexscope_cli/reports/__init__.py +3 -0
  31. nexscope_cli-0.1.0/cli/nexscope_cli/reports/compare.py +135 -0
  32. nexscope_cli-0.1.0/cli/nexscope_cli/reports/formats.py +99 -0
  33. nexscope_cli-0.1.0/cli/nexscope_cli/resources/__init__.py +3 -0
  34. nexscope_cli-0.1.0/cli/nexscope_cli/resources/fields.json +33 -0
  35. nexscope_cli-0.1.0/cli/nexscope_cli/resources/mock-products.json +9 -0
  36. nexscope_cli-0.1.0/cli/nexscope_cli/resources/products-sample.csv +5 -0
  37. nexscope_cli-0.1.0/cli/nexscope_cli/resources/products-sample.json +6 -0
  38. nexscope_cli-0.1.0/cli/nexscope_cli/resources/products-template.csv +1 -0
  39. nexscope_cli-0.1.0/cli/nexscope_cli/resources/products.schema.json +182 -0
  40. nexscope_cli-0.1.0/cli/nexscope_cli/resources/report.html +15 -0
  41. nexscope_cli-0.1.0/cli/nexscope_cli/runner.py +43 -0
  42. nexscope_cli-0.1.0/cli/nexscope_cli/skills/amazon-product-detail/SKILL.md +170 -0
  43. nexscope_cli-0.1.0/cli/nexscope_cli/skills/amazon-product-detail/references/api.md +239 -0
  44. nexscope_cli-0.1.0/cli/nexscope_cli/skills/amazon-product-detail/requirements.txt +1 -0
  45. nexscope_cli-0.1.0/cli/nexscope_cli/skills/amazon-product-detail/scripts/amazon_product_detail.py +26 -0
  46. nexscope_cli-0.1.0/cli/nexscope_cli/skills/amazon-search/SKILL.md +197 -0
  47. nexscope_cli-0.1.0/cli/nexscope_cli/skills/amazon-search/references/api.md +189 -0
  48. nexscope_cli-0.1.0/cli/nexscope_cli/skills/amazon-search/requirements.txt +1 -0
  49. nexscope_cli-0.1.0/cli/nexscope_cli/skills/amazon-search/scripts/amazon_search.py +26 -0
  50. nexscope_cli-0.1.0/cli/nexscope_cli/workflows/__init__.py +3 -0
  51. nexscope_cli-0.1.0/cli/nexscope_cli/workflows/compare.py +213 -0
  52. nexscope_cli-0.1.0/cli/nexscope_cli.egg-info/PKG-INFO +257 -0
  53. nexscope_cli-0.1.0/cli/nexscope_cli.egg-info/SOURCES.txt +112 -0
  54. nexscope_cli-0.1.0/cli/nexscope_cli.egg-info/dependency_links.txt +1 -0
  55. nexscope_cli-0.1.0/cli/nexscope_cli.egg-info/entry_points.txt +2 -0
  56. nexscope_cli-0.1.0/cli/nexscope_cli.egg-info/requires.txt +2 -0
  57. nexscope_cli-0.1.0/cli/nexscope_cli.egg-info/top_level.txt +1 -0
  58. nexscope_cli-0.1.0/docs/HANDOFF-MACOS.md +375 -0
  59. nexscope_cli-0.1.0/pyproject.toml +35 -0
  60. nexscope_cli-0.1.0/scripts/check_resources.py +49 -0
  61. nexscope_cli-0.1.0/scripts/installed_checks.py +206 -0
  62. nexscope_cli-0.1.0/scripts/test_verify_wheel.py +28 -0
  63. nexscope_cli-0.1.0/scripts/verify_os_keyring.py +78 -0
  64. nexscope_cli-0.1.0/scripts/verify_wheel.py +141 -0
  65. nexscope_cli-0.1.0/setup.cfg +4 -0
  66. nexscope_cli-0.1.0/tests/test_comparison.py +93 -0
  67. nexscope_cli-0.1.0/tests/test_datasets.py +129 -0
  68. nexscope_cli-0.1.0/tests/test_evidence.py +189 -0
  69. nexscope_cli-0.1.0/tests/test_execution.py +127 -0
  70. nexscope_cli-0.1.0/third-party-notices/backports-tarfile/LICENSE +17 -0
  71. nexscope_cli-0.1.0/third-party-notices/certifi/LICENSE +20 -0
  72. nexscope_cli-0.1.0/third-party-notices/cffi/LICENSE +23 -0
  73. nexscope_cli-0.1.0/third-party-notices/charset-normalizer/LICENSE +21 -0
  74. nexscope_cli-0.1.0/third-party-notices/cryptography/LICENSE +3 -0
  75. nexscope_cli-0.1.0/third-party-notices/cryptography/LICENSE.APACHE +202 -0
  76. nexscope_cli-0.1.0/third-party-notices/cryptography/LICENSE.BSD +27 -0
  77. nexscope_cli-0.1.0/third-party-notices/idna/LICENSE.md +31 -0
  78. nexscope_cli-0.1.0/third-party-notices/importlib-metadata/LICENSE +73 -0
  79. nexscope_cli-0.1.0/third-party-notices/jaraco-classes/LICENSE +17 -0
  80. nexscope_cli-0.1.0/third-party-notices/jaraco-context/LICENSE +18 -0
  81. nexscope_cli-0.1.0/third-party-notices/jaraco-functools/LICENSE +18 -0
  82. nexscope_cli-0.1.0/third-party-notices/jeepney/LICENSE +21 -0
  83. nexscope_cli-0.1.0/third-party-notices/keyring/LICENSE +18 -0
  84. nexscope_cli-0.1.0/third-party-notices/more-itertools/LICENSE +19 -0
  85. nexscope_cli-0.1.0/third-party-notices/pycparser/LICENSE +27 -0
  86. nexscope_cli-0.1.0/third-party-notices/pywin32-ctypes/LICENSE.txt +28 -0
  87. nexscope_cli-0.1.0/third-party-notices/requests/LICENSE +175 -0
  88. nexscope_cli-0.1.0/third-party-notices/requests/NOTICE +2 -0
  89. nexscope_cli-0.1.0/third-party-notices/secretstorage/LICENSE +25 -0
  90. nexscope_cli-0.1.0/third-party-notices/urllib3/LICENSE.txt +21 -0
  91. nexscope_cli-0.1.0/third-party-notices/zipp/LICENSE +18 -0
  92. nexscope_cli-0.1.0/uv.lock +451 -0
@@ -0,0 +1,525 @@
1
+ # CLI acceptance record
2
+
3
+ Date: 2026-10-26, Asia/Taipei. Current version: `0.1.0` (first independent version).
4
+ The acceptance source baseline is `0.1.2.dev9` at
5
+ `0252b0ec8a02ecdceb4deb691f3c3d0c12b8ed65`. The user selected `0.1.0` for the
6
+ first independent version after dev11 source verification. Historical
7
+ records below retain their original uncommitted/local-candidate context.
8
+
9
+ This record covers implementation in the independent CLI repository, adapted
10
+ from plugin commit `814f28016af6b3ff57ef12093a6bb133c4fb20b9`.
11
+ It does not certify the entire R2 release or any published plugin package.
12
+
13
+ ## Implemented
14
+
15
+ - Prefer documented numeric `extractedPrice`, falling back to numeric `price`
16
+ only when the first is absent/null; preserve zero, reject invalid numbers.
17
+ - Preserve products with unqualified remote currency symbols. Comparable price
18
+ and currency remain unknown; `unresolvedCurrency`/`unresolvedPrice` and exact
19
+ response evidence preserve the source values. Never infer USD from `$`.
20
+ - `workflow compare --resume` validates a completed candidates checkpoint,
21
+ imports its search evidence, rebuilds registered detail requests and applies
22
+ the original cumulative budget. Market, source type, auth mode and origin
23
+ remain bound. Historical search imports do not enter session caches.
24
+ - Versioned datasets can generate HTML/CSV/Markdown offline while preserving
25
+ provenance, input hashes, errors and request accounting. Raw input receipts
26
+ and original dataset references have distinct meanings.
27
+ - Bounded manifests, duplicate-key/non-finite checks, safe relative filenames,
28
+ link/reparse refusal, field validation, evidence/product/request/plan/result
29
+ consistency, non-overwriting outputs and portable report links.
30
+ - Raw input limits: 10 MiB and 10,000 rows. Normalized datasets: 32 MiB;
31
+ complete evidence: 64 MiB. Large CSV fields respect the file limit and restore
32
+ the standard library's previous field limit afterward.
33
+ - Public standard-library regressions, resource/version checker, wheel verifier,
34
+ six-job CI matrix, independent repository documentation and corrected notices.
35
+ Current resource hashes change; historical Skill source snapshot hashes do not.
36
+
37
+ ## Real-service acceptance and dev9 correction
38
+
39
+ The user authorized real paid testing and separately confirmed the browser's
40
+ connection action. An already logged-in **test-environment** account approved
41
+ the connection; CLI credentials were stored only in Windows Credential Manager.
42
+ The existing production environment key was not used. New persistent access was
43
+ confirmed before creation, and the authorized test connection remains available
44
+ for revocation in the test site's API Access page.
45
+
46
+ Maximum authorized data calls: **4**. Actual data calls: **4** (one search, three
47
+ details). CLI automatic retries: **0**. No further data request was issued after
48
+ the budget was exhausted. Authentication/account reads are separate from these
49
+ four data calls. No production database write, deployment or refund was made.
50
+
51
+ | Invocation | Actual result | Confirmed charge |
52
+ | --- | --- | --- |
53
+ | dev8 keyword search, one page, `desk lamp` | Business 13007; upstream errcode 10000, no matching results; no candidates | 0 credits, provider diagnostic |
54
+ | dev8 detail `B072MQ5BRX` | Server code 0 with one product, but CLI rejected `currency: "$"` as INVALID_PRODUCT | 90 credits, ledger |
55
+ | dev8 detail `B08N5WRWNW` | Server code 0, empty products; CLI EMPTY_DATA | 10 credits, ledger |
56
+ | dev9 detail `B072MQ5BRX`, one explicit verification call after the fix | COMPLETE / SUCCESS, exit 0, one product; no cache hit | 45 credits, ledger |
57
+
58
+ **Total attributed charge: 145 credits**, confirmed by three test-ledger debit
59
+ records and their user/route/time matches. The 10-credit empty-data debit remains
60
+ a real charge; no refund was requested or performed. The whole account balance
61
+ also changed because of concurrent activity, so its total delta was not used as
62
+ the attribution measure. The bounded provider-log sample includes the original
63
+ three attempts; the last verification is independently evidenced by its saved
64
+ request/response and matching ledger time/route. Complete distributed-trace
65
+ correlation and the registration/payment funnel are not certified here.
66
+
67
+ The live defect was reproduced with a failing regression, then fixed in the
68
+ shared validator and mapper. Remote currency metadata must be a string; an
69
+ unqualified symbol is retained as unresolved metadata, while normalized currency
70
+ and comparable price stay null. The saved real response revalidates offline with
71
+ dev9 and preserves the original source price `15.27` and symbol `$`. The original
72
+ dev8 FAILED record is unchanged, rather than relabeled as a successful run.
73
+
74
+ Historical pre-publication wheel: `dist/nexscope_cli-0.1.2.dev9-py3-none-any.whl`, SHA-256
75
+ `eaf560de2d949444b266308f9058acd679cfc622027e66f8ec616fb15f68a5e5`.
76
+ Installed-wheel regressions: **30 pass on Windows and 30 on Ubuntu WSL2**;
77
+ offline commands, loopback dual-auth, legacy adapters/runner, and dev8↔dev9
78
+ upgrade/rollback pass. Windows's real isolated OS-store persistence and cleanup
79
+ checks also pass. The live detail succeeded after these checks. Bundled adapter
80
+ version pins and current hashes were updated; historical source snapshots were
81
+ retained.
82
+
83
+ Evidence is under `dist/live-20261026-1600/` (Git ignored): immutable dev8/dev9
84
+ request bundles, filtered account snapshots, the four-call journal, read-only
85
+ ledger evidence, bounded redacted log metadata, offline revalidation, and three
86
+ original-failure audit report formats. `live-test-summary.json` indexes hashes
87
+ and results. Secrets and raw unfiltered logs are excluded. The failure reports
88
+ faithfully retain zero successful products from the original run; they are not
89
+ presented as a successful comparison.
90
+
91
+ **Disposition: partial acceptance.** Real account connection, valid live detail,
92
+ charge reconciliation and the currency correction pass. Successful keyword
93
+ selection/resume and a complete live multi-product comparison remain unaccepted
94
+ because the search returned no candidates and the original second detail was
95
+ empty. Mock/replay checks do not substitute for those missing live outcomes.
96
+
97
+ ## Initial local verification (before the additional acceptance below)
98
+
99
+ - All 28 regression tests pass on Windows with Python 3.11.9 and 3.12.14.
100
+ - Actual wheel built with Python 3.12.14, pip 26.2.1, setuptools 84.0.0.
101
+ - Fresh venv outside the checkout; actual wheel installed without editable mode
102
+ or dependencies. Source path injection removed; imports checked against
103
+ `site-packages` in that environment. Wheel subpackages, resources and license
104
+ files inspected. No bytecode or plugin metadata included in the wheel.
105
+ - Network and keyring/requests imports blocked for offline checks: template,
106
+ samples, schema, doctor, plans, three report formats, versioned re-exports,
107
+ fictional three-ASIN task, keyword selection/resume and partial failure.
108
+ Paths contain spaces and Chinese characters.
109
+ - 10,000-row input and a near-10-MiB input with a larger normalized output;
110
+ rejection of row/byte overflow, malformed input and inconsistent evidence.
111
+ - Fictional loopback HTTP service exercises both auth contexts, keyword resume,
112
+ price-only detail responses and authenticated redirect refusal. Browser auth
113
+ uses an in-memory fake keyring backend. It never accesses a real OS credential
114
+ store, service account or billable Nexscope endpoint.
115
+ - Standalone installed legacy scripts preserve page/batch input, flags and env
116
+ behavior. The legacy browser `run` path also passes with reviewed hash-pinned
117
+ dependencies installed from PyPI. No arbitrary dependency is auto-installed
118
+ during a query.
119
+ - Explicit old wheel supplied to the verifier: install `dev7`, upgrade to `dev8`,
120
+ roll back to `dev7`, restore `dev8`; command version checks pass. User-report
121
+ and test environment-key sentinels survive. This does not test real OS-keyring
122
+ credential persistence across installer operations.
123
+
124
+ ## Public source and hosted CI
125
+
126
+ The repository is public at <https://github.com/nexscope-ai/nexscope-cli> and the
127
+ initial implementation was pushed to `main` as commit
128
+ `d5ed885ef87a248f82827a8c6252760e340d7a7a`. Its
129
+ [installed-wheel workflow](https://github.com/nexscope-ai/nexscope-cli/actions/runs/40296830306)
130
+ completed successfully on Windows, Ubuntu and macOS with Python 3.11 and 3.12:
131
+ all six jobs passed. These are builds from an immutable Git commit. Private
132
+ live-test artifacts and credentials were excluded from the commit and push.
133
+
134
+ This closes the corresponding hosted installation/offline/loopback matrix,
135
+ including Windows Python 3.11. It does not certify a local Mac's Keychain,
136
+ real-account connection, real comparison workflows, Linux desktop credential
137
+ services, refunds or host integrations. No package release, tag or plugin upload
138
+ was made. See `docs/HANDOFF-MACOS.md` for the remaining Mac work.
139
+
140
+ ## Additional executable acceptance, 2026-10-26
141
+
142
+ The same wheel was tested again, without changing its runtime code:
143
+ `nexscope_cli-0.1.2.dev8-py3-none-any.whl`, SHA-256
144
+ `653e86eb614ee649fddd58b10b36631dc9ce2c949af534c6b3371fc9b18b1024`.
145
+
146
+ | Acceptance item | Evidence and outcome |
147
+ | --- | --- |
148
+ | Windows external wheel installation | PASS: Python 3.12.14; 28 installed regressions, offline CLI/report/workflow cases, loopback dual-auth and legacy scripts/runner |
149
+ | Windows real Credential Manager | PASS: actual `keyring.backends.Windows`, unique fictional service entry, write/read and fingerprint verification; original account entries untouched |
150
+ | Windows credential persistence | PASS: test credential survives dev8→dev7→dev8 and package uninstall/reinstall; final deletion confirmed |
151
+ | Ubuntu WSL2 external installation | PASS: Python 3.12.3, glibc 2.39, Linux 6.6.87.2 WSL2; 28 installed regressions, offline cases, loopback dual-auth and legacy scripts/runner |
152
+ | Ubuntu WSL2 upgrade/rollback | PASS: dev7→dev8→dev7→dev8, executable version checks and user-report preservation |
153
+ | Linux desktop credential store prerequisite | BLOCKED: actual backend is `keyring.backends.fail`; CLI rejection confirmed (`UNAVAILABLE_FAIL_CLOSED`); no plaintext fallback |
154
+ | Real test API unauthenticated account request | PASS for negative authentication only: GET `/api/cli/account`, HTTP 200, business code 12003, no data returned; one request, no credentials sent |
155
+ | Live-data prerequisites before paid-test approval | The configured environment key belonged to production and was not used; later paid testing used a separately approved test browser connection as recorded above |
156
+
157
+ Ubuntu's system Python lacks `ensurepip`, and passwordless sudo was unavailable.
158
+ The verifier instead created an ordinary isolated venv and bootstrapped pip from
159
+ the explicit Python-bundled `pip-25.0.1-py3-none-any.whl`, SHA-256
160
+ `c46efd13b6aa8279f33f2864459c8ce587ea6a1a59ee20de055868d8f7688f7f`.
161
+ Application imports still came exclusively from the new venv's `site-packages`.
162
+ No system package, sudo configuration or WSL configuration was changed.
163
+
164
+ Repeat the Windows OS-store check with:
165
+
166
+ ```sh
167
+ python scripts/verify_wheel.py dist/nexscope_cli-0.1.2.dev8-py3-none-any.whl --previous-wheel /path/to/nexscope_cli-0.1.2.dev7-py3-none-any.whl --with-dependencies --with-os-keyring
168
+ ```
169
+
170
+ For WSL2, run the same verifier with its Linux Python, use mounted absolute wheel
171
+ paths and supply `--pip-wheel /path/to/reviewed/pip.whl` if ensurepip is missing.
172
+ `--with-os-keyring` requires a working real desktop credential store; the regular
173
+ dependency check also records availability and verifies fail-closed rejection.
174
+
175
+ Evidence files, ignored by Git and containing no credential values:
176
+
177
+ - `dist/verification-windows-os-keyring-py312.txt`
178
+ - `dist/verification-linux-wsl2-py312.txt`
179
+ - `dist/live-route-prerequisites.json`
180
+ - `dist/credential-prerequisites.json`
181
+ - `dist/acceptance-20261026.json` (artifact/test/verifier fingerprints)
182
+
183
+ That pre-live acceptance changed only verification scripts and documentation.
184
+ Its dev8 artifact and provenance remain unchanged. The later live correction is
185
+ separately versioned dev9, with its own wheel and checks recorded above.
186
+
187
+ The historical local wheel hashes and external-install transcripts are saved in
188
+ `dist/`, which is ignored by Git. Those tests predated source publication. Record
189
+ `git rev-parse HEAD` and the actual built wheel hash for each subsequent run;
190
+ documentation and build timestamps can change wheel bytes. A versioned release
191
+ still requires review and verification from an immutable source commit.
192
+
193
+ ## Outstanding release gates
194
+
195
+ | Gate | Status |
196
+ | --- | --- |
197
+ | Windows fresh wheel, offline and loopback checks | Locally verified as described above |
198
+ | Real Windows OS keyring | Verified with isolated synthetic credentials, including upgrade/rollback/uninstall and cleanup |
199
+ | Real Nexscope login and valid test-account calls | PASS for an existing logged-in test account, approved CLI connection, and one successful dev9 live detail; new-user registration is not tested |
200
+ | Linux WSL2 install, offline, loopback and upgrade/rollback | Verified locally on Ubuntu Python 3.12.3; does not certify all Linux hosts |
201
+ | Linux Secret Service/KWallet | BLOCKED on this headless WSL2 host: `keyring.backends.fail`, fail-closed rejection verified; no desktop-store persistence acceptance |
202
+ | macOS install, OS keyring and upgrade/rollback | PASS locally for arm64/macOS 27.0, Python 3.11.15/3.12.13; real Keychain dev9↔dev10 and uninstall persistence/cleanup on Python 3.12.13, with an explicitly approved browser connection; see completion record below |
203
+ | Real search/detail response shapes, balance, pricing, billed/refund outcomes | PARTIAL: Mac live comparison and 2-success/1-failure case pass with 6 calls / 230-credit reconciliation; search failed, so live resume is BLOCKED. Earlier Windows 145 credits are separate. Refund/server-attribution gates remain unaccepted |
204
+ | Codex/Claude Code natural-language three-ASIN, keyword and partial tasks | Offline/mock tasks pass in both actual hosts. Claude dev10 and fresh configured Codex dev11 live direct/partial pass. Live search/resume and published-plugin gates remain unaccepted; see fresh-session correction below |
205
+ | Registration → effective call → payment/refund server attribution | Existing CLI metadata only; backend/web chain not implemented or certified here |
206
+ | Named pilot owners, compatibility window, support and acceptance sample | Needs product/release assignment |
207
+ | Source commit and CI | Verify the checked-out commit with `git rev-parse HEAD` and inspect its actual CI results; the local evidence above predates source publication |
208
+ | Versioned releases and downstream Skills/plugin migration | No package release, tag or plugin upload; separate acceptance and release authorization remain required |
209
+ | Official published plugin contents | Not inspected or modified |
210
+
211
+ Do not mark the R2 release accepted, replace existing published Skills, or
212
+ describe fictional fixtures as live acceptance until the relevant gates pass.
213
+ The three known CLI defects are addressed; these external gates remain explicit.
214
+
215
+ ## Local macOS free-phase record, 2026-10-26 (Asia/Taipei)
216
+
217
+ Actual checkout: `main`, HEAD `0252b0ec8a02ecdceb4deb691f3c3d0c12b8ed65`;
218
+ new clone, initially clean. No pre-existing checkout or user changes were replaced.
219
+ Platform: **macOS 27.0 (26A428), arm64**. Executed interpreters:
220
+ Python **3.11.15** (uv) and **3.12.13** (mise). System Python 3.9.6 was not used
221
+ for the package. No x86_64, other local OS, or post-change hosted CI claim is made.
222
+
223
+ The final dev10 candidate is that HEAD **plus local uncommitted fixes and version
224
+ pins**, not an immutable dev10 Git commit. No commit, push, tag, release, PyPI
225
+ publication or downstream plugin update was performed. Wheel bytes were compared
226
+ against every current packaged source/resource file and matched.
227
+
228
+ | Artifact | Actual SHA-256 |
229
+ | --- | --- |
230
+ | Initial Mac dev9 wheel, `dist/nexscope_cli-0.1.2.dev9-py3-none-any.whl` | `55606905a9c5acf5c0d5c7e63c517a7525109e825922a0388dc8446ff73ea13c` |
231
+ | Rebuilt, verified dev9 predecessor, `dist/rebuilt/nexscope_cli-0.1.2.dev9-py3-none-any.whl` | `618c18c6c7e134eb992479242d60fa672d9ac99bfd2519b8b3529bc2d7fff02e` |
232
+ | Final local dev10, `dist/dev10/nexscope_cli-0.1.2.dev10-py3-none-any.whl` | `eb36658d08cf523c714444bb82ce5fc3acf16a305248fbcbd688f3c5fc25744e` |
233
+
234
+ ### PASS
235
+
236
+ - `python scripts/check_resources.py`: resource integrity and paired adapter
237
+ pins pass. Historical `sourceSnapshot` hashes are unchanged.
238
+ - Actual wheels installed into fresh environments outside the checkout;
239
+ source-path injection removed and imports checked against `site-packages`.
240
+ Dev9: **30 installed regressions per interpreter**. Dev10: **31 per
241
+ interpreter**, offline reports, space/non-ASCII paths, failure exits, output
242
+ preservation and fictional loopback dual-auth checks pass.
243
+ - Real `keyring.backends.macOS` on Python 3.12.13: unique synthetic credential
244
+ write/read, dev9→dev10→dev9→dev10 persistence, uninstall/reinstall retention,
245
+ and deletion verification pass. Only verifier-owned synthetic entries were
246
+ deleted; Keychain protections were not changed. Python 3.11 rollback/version
247
+ and user-report retention pass; real-store persistence was exercised on 3.12.
248
+ - User logged into the test frontend and explicitly approved **Connect
249
+ Nexscope** before a persistent CLI Key was created. Installed dev10 completed
250
+ `auth poll`; browser and CLI account matched. Credential exists in Keychain,
251
+ pending credential was removed, and its value was absent from this run's
252
+ controlled text artifacts. This is not a whole-disk secret audit.
253
+ - Browser-account `account` with an unrelated environment sentinel still
254
+ matched the browser account. Installed-wheel negative checks show that an
255
+ empty browser namespace does not use an environment key, and missing env-mode
256
+ variables neither read Keychain nor fall back to the connected browser.
257
+ Both negatives exited 1 with network blocked. Loopback positive dual-auth
258
+ coverage remains distinct from two real-account positive modes.
259
+ - Actual **Codex CLI 0.163.0** and **Claude Code 2.1.308** received natural-language
260
+ tasks and drove the installed dev10 CLI: three-product COMPLETE (3 successes,
261
+ exit 0, 3 mock requests), keyword CANDIDATES_READY (1), saved `--resume`
262
+ COMPLETE (2 new requests, cumulative 3, exit 0), PARTIAL (2 successes + 1
263
+ EMPTY_DATA, exit 1, 3 requests), all three report formats and offline
264
+ re-export. Search evidence was byte-identical on resume, and ASIN-selected
265
+ mock detail fields now match their candidates. These are **offline/mock host
266
+ runs**, not live data or published-plugin acceptance. Both hosts also ran the
267
+ original dev9; its original outputs and the discovered mismatch are retained.
268
+ - Own-account **API Access → Call Details** provides a read-only reconciliation
269
+ entry with UTC time, masked key, route, actual credits, request and diagnostic
270
+ IDs. Only older calls appeared in the observed latest page; the new Mac key
271
+ had no data-call row. No CSV/key export, credential discovery or database access
272
+ was used. The whole account balance delta was not attributed to this task.
273
+
274
+ ### FAIL, preserved and corrected
275
+
276
+ - Original `verify_wheel.py` copied the Python executable. Both local Python
277
+ distributions aborted with SIGABRT; direct reproduction showed dyld could not
278
+ find relative `libpython3.12.dylib`. A failing verifier regression was added
279
+ before the fix. Using the platform's normal venv symlink behavior on POSIX
280
+ fixed both interpreters; Windows retains copies. The external-wheel regression
281
+ and final installed checks pass. Original failure logs remain unchanged.
282
+ - Actual Claude host inspection exposed known mock ASINs receiving another
283
+ fixture's title/price in detail responses. The new regression failed for the
284
+ three candidates before the correction. Dev10 selects a matching fixture by
285
+ ASIN, preserving the existing deterministic fallback for arbitrary fictional
286
+ IDs. Both hosts re-executed against the rebuilt dev10 and confirmed matching
287
+ fields. Static mock keyword data remains intentionally fictional.
288
+
289
+ ### BLOCKED / separate gates
290
+
291
+ - Live successful multi-product comparison, keyword/resume, real partial
292
+ completion and corresponding live-host tasks: **this free-phase checkpoint preceded the later 20-call authorization;
293
+ see the post-approval record below for actual outcomes**. Prior four-call authorization is
294
+ exhausted. No new live product/search request has been sent.
295
+ - A second real env-api-key account has not been provisioned or used. Positive
296
+ real env-mode account isolation is unaccepted; no browser credential was
297
+ exported into the environment to simulate it.
298
+ - Refunds, complete server-side attribution, registration/payment funnel,
299
+ Linux desktop keyrings, named pilot/support ownership and downstream release
300
+ gates remain separate. Existing Codex host startup reported a stale
301
+ `nexscope_test` MCP OAuth `invalid_grant`; offline CLI tasks used no MCP query
302
+ and no host settings were changed. Published-plugin discovery was not tested.
303
+
304
+ New **Nexscope data calls: 0; automatic data retries: 0**. Five CLI auth/account
305
+ HTTP requests were made: one start, one poll, one acknowledgement and two account
306
+ reads; browser login/approval traffic is separate. No newly attributed data
307
+ debit exists in this run's evidence; this is not a complete account-ledger audit.
308
+ The old **145 credits** remain historical and are not charged to this Mac run.
309
+ Claude's two host runs separately reported model list-price costs of
310
+ USD 0.4659312 and 0.6272848; these are not independently reconciled charges or
311
+ Nexscope credits. Codex supplied token usage without a monetary amount.
312
+
313
+ Commands (replace `python` with the recorded 3.11 or 3.12 interpreter):
314
+
315
+ ```sh
316
+ python -m pip wheel --no-deps --wheel-dir dist/dev10 .
317
+ python scripts/check_resources.py
318
+ python scripts/verify_wheel.py dist/dev10/nexscope_cli-0.1.2.dev10-py3-none-any.whl --previous-wheel dist/rebuilt/nexscope_cli-0.1.2.dev9-py3-none-any.whl --with-dependencies --with-os-keyring
319
+ python scripts/test_verify_wheel.py dist/dev10/nexscope_cli-0.1.2.dev10-py3-none-any.whl
320
+ ```
321
+
322
+ Python 3.11 ran the verifier with `--previous-wheel`, without the two keyring/
323
+ dependency flags. Private evidence: **`dist/macos-20261026/` (Git ignored)**,
324
+ including original failures, build/install/verification transcripts, auth/account
325
+ snapshots without keys, read-only billing table, host prompts/events, copied host
326
+ outputs, `acceptance-summary.json` and file hashes. Offline reruns are explicitly
327
+ labeled and never replace original failures. The external `live-env` and host
328
+ working directories under `~/.local/share/nexscope-cli-acceptance/20261026/` are
329
+ retained for pending acceptance; no task worktrees or branches were created.
330
+
331
+ ## Post-approval live acceptance on this Mac
332
+
333
+ The user explicitly expanded authorization to **20 data calls, no credit ceiling**,
334
+ and delegated sample selection. Fixed samples: `B072MQ5BRX`, `B07FZ8S74R`, with
335
+ `B08N5WRWNW` solely as the historical failure sample; one keyword,
336
+ **`wireless mouse`**, on `amazon.com`. All runs used the installed dev10 wheel
337
+ SHA-256 `eb36658d08cf523c714444bb82ce5fc3acf16a305248fbcbd688f3c5fc25744e`
338
+ outside the checkout, origin `https://test-claw-callback.nexscope.ai`, and the
339
+ approved Mac browser-account Keychain connection. Source remains the recorded
340
+ dev9 HEAD plus local uncommitted dev10 changes. No production call occurred.
341
+
342
+ | Gate | Status and evidence |
343
+ | --- | --- |
344
+ | Actual Claude Code direct two-product workflow | **PASS**: COMPLETE, 2/2 successes, exit 0; 2 requests, no cache hits/retries; three report formats and original responses |
345
+ | Single live keyword search | **FAIL, upstream**: business 13007, empty candidates, exit 1; 1 request; original failure preserved |
346
+ | Live keyword `--resume` | **BLOCKED**: no completed CANDIDATES_READY checkpoint; no duplicate search, altered keyword or extra selection |
347
+ | Actual Claude Code partial workflow | **PASS**: B072MQ5BRX and B07FZ8S74R succeed; B08N5WRWNW EMPTY_DATA; PARTIAL, 2/3 successes, exit 1, 3 requests; three formats retain errors |
348
+ | Live dataset offline re-export | **PASS**: direct and partial outputs re-export into HTML/CSV/Markdown, preserving source data, original request bytes/hashes, errors, accounting and relative evidence links; clearly offline revalidation |
349
+ | Actual Codex CLI live execution | **BLOCKED**: workspace-write host sandbox produced KeyringError before workflow artifacts; the host execution failed and was not retried. No Keychain or sandbox protections were weakened. Offline host checks remain separate PASS |
350
+ | Bounded read-only billing reconciliation | **PASS**: six new-key call-detail rows and new-key summary match 6 requests / 230 charged credits; separate from old key's 145 credits |
351
+
352
+ **Actual data calls: 6 / 20; unused: 14; automatic retries: 0.** Five details and
353
+ one search were sent. The direct result contains coffee and Echo Dot products;
354
+ this is functional comparison acceptance, not a claim they are competing
355
+ products. Both remote `$` currencies remain unresolved, prices unknown for
356
+ comparison, with original numeric prices retained as evidence.
357
+
358
+ | Phase, UTC 2026-10-26 | ASIN/query | Actual CLI outcome | Visible charged credits |
359
+ | --- | --- | --- | --- |
360
+ | Direct, 10:02:03 | B072MQ5BRX | SUCCESS | 45 |
361
+ | Direct, 10:02:04 | B07FZ8S74R | SUCCESS | 90 |
362
+ | Search, 10:05:00 | wireless mouse | BUSINESS_13007, no candidates | `—` in call detail; no additional numeric debit in matched key summary |
363
+ | Partial, 10:06:08 | B072MQ5BRX | SUCCESS | 45 |
364
+ | Partial, 10:06:09 | B07FZ8S74R | SUCCESS | 45 |
365
+ | Partial, 10:06:10 | B08N5WRWNW | EMPTY_DATA | 5 |
366
+
367
+ The five numeric detail charges total **230 credits**, matching the new key's
368
+ six-call summary. The empty-data debit is real and was not refunded. Do not
369
+ translate the search detail's dash into an independently certified zero, or use
370
+ response `cost` as credits. API usage labels all six admitted requests SUCCESS;
371
+ that label does not override the saved CLI business failure or empty result.
372
+ Matching uses the isolated new key, UTC intervals and routes; private billing
373
+ request/diagnostic IDs are retained. Detail payload trace IDs were null, and
374
+ the search provider trace ID is not asserted equal to the billing diagnostic ID.
375
+ Full distributed tracing and refund/server attribution remain separate gates.
376
+
377
+ Earlier account call-table snapshots had no new rows. A fresh page and current
378
+ Last 7 days query subsequently exposed all six; those initial snapshots remain
379
+ unaltered, and their temporary billing BLOCKED status is superseded by this
380
+ bounded reconciliation. The account balance also changed with concurrent work;
381
+ its delta was never used as this run's expense.
382
+
383
+ Installed commands were driven by natural-language prompts in actual Claude
384
+ Code, with the CLI pinned and no MCP data calls. Each phase saved a dry-run and
385
+ one execution: direct `--asins B072MQ5BRX,B07FZ8S74R --max-calls 2`; search
386
+ `--keyword "wireless mouse" --max-calls 3`; partial
387
+ `--asins B072MQ5BRX,B07FZ8S74R,B08N5WRWNW --max-calls 3`. Executions used
388
+ `--market amazon.com --auth-mode browser-account --execute --allow-paid --format all`.
389
+ Exact commands, UTC times and exits are in the private transcripts.
390
+
391
+ Private evidence: `dist/macos-20261026/live/`, including original host failure,
392
+ live bundles, offline re-exports, call-table/key-summary text, `live-summary.json`
393
+ and hashes. External `live-codex/` and `live-claude/` directories under the
394
+ recorded acceptance root are retained for pending gates. The persistent approved
395
+ test connection remains in Keychain and can be revoked in API Access. No key
396
+ value was exported into the environment or a file, no Windows credentials were
397
+ copied, and no refund/database write/deployment/publication was performed.
398
+
399
+ **Disposition remains partial acceptance.** Do not spend the remaining allowance
400
+ on automatic retries, new keywords or extra ASINs. Successful live search/resume,
401
+ supported Codex live credential access, positive real env-mode isolation, refund/
402
+ full server attribution and downstream release gates remain unaccepted.
403
+
404
+ ### Final local dev11 correction and offline verification
405
+
406
+ Claude's partial-case offline re-export found another preflight defect:
407
+ `report compare --dry-run` returned PLAN_READY for a missing output parent,
408
+ while export failed. The existing output-preservation regression was extended
409
+ and failed before the fix. Dev11 checks the parent directory and output/evidence
410
+ collisions before either dry-run or export, without creating directories or
411
+ overwriting files. Repeated export after explicitly creating a parent is labeled
412
+ an **offline rerun**, never a new live call. Original host/export failures remain.
413
+
414
+ Final wheel: **`dist/dev11/nexscope_cli-0.1.2.dev11-py3-none-any.whl`**, SHA-256
415
+ **`5c94b388da7f691841aef346195806887fae9f1a6148f62aed130f6c1f2afa5c`**.
416
+ Its packaged bytes match the current local source/resources. Source HEAD is
417
+ unchanged; this remains an uncommitted local candidate. Version pins and current
418
+ adapter hashes match dev11; historical snapshots are unchanged.
419
+
420
+ **PASS**: source 31 regressions; actual dev11 installed wheel 31 regressions on
421
+ each Python 3.11.15/3.12.13; offline/loopback cases and resource checks; 3.12
422
+ hash-pinned dependency/legacy checks plus real macOS Keychain dev10↔dev11
423
+ write/read/rollback/uninstall retention/cleanup; 3.11 version/report rollback.
424
+ The separate external-environment verifier regression also passes. Commands:
425
+
426
+ ```sh
427
+ python scripts/check_resources.py
428
+ python scripts/verify_wheel.py dist/dev11/nexscope_cli-0.1.2.dev11-py3-none-any.whl --previous-wheel dist/dev10/nexscope_cli-0.1.2.dev10-py3-none-any.whl --with-dependencies --with-os-keyring
429
+ python scripts/test_verify_wheel.py dist/dev11/nexscope_cli-0.1.2.dev11-py3-none-any.whl
430
+ ```
431
+
432
+ The 3.11 verifier again omitted dependency/OS-keyring flags. Installed dev11
433
+ re-exported both original live dev10 datasets into all three formats offline,
434
+ preserving products/errors/accounting and every original request byte. Missing
435
+ parent dry-runs now exit 1 without creating outputs. **No dev11 live request was
436
+ sent**; live host outcomes above belong to the exact dev10 wheel, not dev11.
437
+ `live/dev11-offline-revalidation.json` records this distinction.
438
+
439
+ Additional Claude live-stage model usage reported USD 0.7058736 (direct),
440
+ 0.2560884 (keyword) and 0.695398 (partial). These provider-reported list-price
441
+ figures are not independently reconciled payments and are separate from the
442
+ 230 Nexscope credits. All raw live/host/export failures, final transcripts,
443
+ source diff and SHA-256 index remain in the ignored evidence directory.
444
+
445
+ ## Fresh Codex session retest and permission-profile correction
446
+
447
+ The user requested a new session after suspecting a changed conversation key,
448
+ then explicitly narrowed further work to **Codex only**. No old Codex session
449
+ was resumed. The original `KeyringError` records remain unchanged.
450
+
451
+ **PASS / test-setup correction:** earlier child Codex runs had been launched
452
+ with an extra `--sandbox workspace-write` override. The user's existing local
453
+ configuration was already `sandbox_mode = "danger-full-access"`. A local
454
+ diagnostic reproduced `keyring.backends.macOS` → `KeyringError` → native
455
+ `Error(-50)` under the extra sandbox; Codex's denial capture reported blocked
456
+ `mach-lookup com.apple.securityd.xpc` and `com.apple.SecurityServer`. The same
457
+ credential read succeeded in the current host. This identifies an added test
458
+ restriction rather than an expired Nexscope connection. An initial diagnostic
459
+ script mistakenly called `client.store.load` and raised AttributeError; that
460
+ diagnostic failure was retained, corrected to `client.load`, and is not treated
461
+ as a CLI defect.
462
+
463
+ A fresh `codex exec --ephemeral --skip-git-repo-check --json` run, **without a
464
+ sandbox override**, inherited the user's existing permissions. No global config,
465
+ Keychain protection or OS security setting was changed; no new key was created,
466
+ and no credential was exported. Installed CLI was dev11, with the same recorded
467
+ wheel hash and unchanged local source HEAD.
468
+
469
+ | Fresh configured Codex gate | Outcome |
470
+ | --- | --- |
471
+ | Normal `account` | **PASS**, existing approved Mac account connected |
472
+ | Direct B072MQ5BRX/B07FZ8S74R | **PASS**, COMPLETE, 2 successes, exit 0, 2 requests |
473
+ | Single `wireless mouse` search | **FAIL**, BUSINESS_13007, exit 1, 1 request, no candidates |
474
+ | Real keyword `--resume` | **BLOCKED**, no completed candidates; not a Codex conversation-resume operation |
475
+ | Fixed three-ASIN partial case | **PASS**, 2 successes + B08N5WRWNW EMPTY_DATA, PARTIAL, exit 1, 3 requests |
476
+ | All reports and offline re-export | **PASS**, direct/partial HTML/CSV/Markdown; manifests and original request bytes preserved |
477
+
478
+ This closes **Codex live account/direct/partial acceptance for the user's current
479
+ configured profile**, not Keychain access under workspace-write restrictions.
480
+ New conversation creation does not resolve the server search error. A bounded
481
+ read-only log query for the new search trace returned zero matches; its deeper
482
+ provider cause remains unconfirmed. No backend fix or retry was attempted.
483
+
484
+ Before the user narrowed scope, one extra fresh Claude session re-tested only
485
+ the failed keyword (not its already-passing direct/partial cases): 1 request,
486
+ BUSINESS_13007, no resume. This extra call is explicitly counted. No further
487
+ Claude task was launched after the Codex-only instruction.
488
+
489
+ **New configured Codex requests: 6, charged 185 credits** (direct 45+45;
490
+ partial 45+45+5). The additional search detail rows display `—`; new-key summary
491
+ reconciles **13 cumulative Mac calls / 415 charged credits**. This is the earlier
492
+ 6/230, one extra failed Claude search, plus Codex 6/185. **7 of 20 calls remain
493
+ unused; automatic retries 0.** Each repeated search was an explicit user-requested
494
+ fresh-session retest, not an automatic retry. The historical Windows key's 145
495
+ credits remain separate; account balance deltas and response `cost` are unused.
496
+
497
+ Private original/fresh-session prompts, exits, diagnostic exceptions/denials,
498
+ live dev11 bundles, offline reports and read-only billing rows are under
499
+ `dist/macos-20261026/retest/`, indexed by `retest-summary.json` and the parent
500
+ SHA-256 index. Original failures are retained. External `retest-codex/`,
501
+ `retest-codex-configured/`, and `retest-claude/` directories are retained for
502
+ reproducibility. No source/runtime change or publication was needed for this
503
+ retest. Remaining gates include live successful search/resume, positive real
504
+ env-key isolation, full backend/refund attribution and release authorization.
505
+
506
+ ## First independent version: 0.1.0
507
+
508
+ At the user's request, the current version is **0.1.0**, replacing the development
509
+ version label. Package metadata, module version, dependency locks, paired Skill
510
+ requirements/adapter pins, installation instructions and CI wheel path agree.
511
+ Historical test versions and original failures above are preserved as recorded.
512
+ No runtime behavior or outstanding acceptance status changed with this renumbering.
513
+
514
+ Built from source baseline `430461255eff13a2119486912682742e68d7582e` plus this
515
+ version change: `dist/version-0.1.0/nexscope_cli-0.1.0-py3-none-any.whl`, SHA-256
516
+ `5703a4c748d32759903270fb4fbeeb2b84ea5e905e3c7dd29204eb551c8a9a47`.
517
+ Resource checks pass. Actual external installed-wheel verification passes on
518
+ Python 3.11.15 and 3.12.13: **31 regressions each**, offline/loopback checks and
519
+ version-transition/report preservation against the exact prior dev11 wheel.
520
+ Python 3.12 additionally passes hash-pinned dependencies/legacy checks and real
521
+ Keychain write/read, version-transition/uninstall persistence and cleanup.
522
+ This is a version transition, not a claim that 0.1.0 sorts above 0.1.2.dev11.
523
+ No new paid call was made; cumulative usage remains 13/20 and 415 credits.
524
+ Private transcripts are in ignored `dist/version-0.1.0/`. Source push is
525
+ authorized; PyPI, GitHub Release assets/tags and plugin publication are separate.
@@ -0,0 +1,9 @@
1
+ # Bundled asset attribution
2
+
3
+ Copyright 2026 Nexscope.
4
+
5
+ This independent CLI contains report templates and fictional product samples.
6
+ Templates use system fonts, with no external font, JavaScript or image assets.
7
+ The original plugin icon and plugin entrypoint are not part of this distribution.
8
+ Apache-2.0 Section 6 governs trademark use; the copyright license does not grant
9
+ trademark rights or imply Nexscope endorsement of modified distributions.