Skip to content

Commit bbca9c4

Browse files
author
SqlRush
committed
Accept numeric microcompact bool strings
1 parent d36386e commit bbca9c4

5 files changed

Lines changed: 14 additions & 3 deletions

File tree

docs/cc-100-roadmap.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ M7 补充:scripted permission payload、dialog expectation、event、cancel-pe
4040

4141
M6 补充:microcompact disk cache loader 和 prune 现在接受 digest 缺失但文件名已 keyed 的 cache entry,会用 `<digest>.json` 文件名作为 digest fallback,同时保留显式 digest mismatch 的 invalid-cache guard。
4242

43-
M6 补充:microcompact disk cache loader 的 `cached`/`fromCache`/`cacheHit`/`isCached` 布尔字段现在接受 JSON bool、`true`/`false``yes`/`no``on`/`off``1`/`0` 数字/字符串形态。
43+
M6 补充:microcompact disk cache loader 的 `cached`/`fromCache`/`cacheHit`/`isCached` 布尔字段现在接受 JSON bool、`true`/`false``yes`/`no``on`/`off``1`/`0` 数字/字符串形态,以及 whole-number 数字字符串如 `"1.0"`/`"0.0"`
4444

4545
M6 补充:microcompact disk cache loader 现在接受 JSON:API/resource-style `resource`/`attributes`/`properties` wrapper,summary payload 可放在 attributes/properties 内,外层 resource `id` 可作为 digest fallback。
4646

docs/claude-code-go-rewrite-plan.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ test/parity/ # golden tests against TS/official behavior
323323
- 本轮补充:microcompact disk cache loader 的字段和 wrapper 查找现在接受大小写、snake_case 和 kebab-case 相邻形式归一,例如 `cache-entry` 内的 `summary-text``cache-key``cache-version``created-at``ttl-seconds` 可恢复同一 cache entry。
324324
- 本轮补充:microcompact disk cache loader 的 direct payload 判定也复用大小写、snake_case 和 kebab-case summary 别名归一,顶层 `summary-text` 搭配 `data`/`payload` sidecar 时仍会优先保留顶层摘要,不会被误判为 wrapper。
325325
- 本轮补充:microcompact disk cache loader 和 prune 现在接受 digest 缺失但文件名已 keyed 的 cache entry,会用 `<digest>.json` 文件名作为 digest fallback,同时仍保留显式 digest mismatch 的 invalid-cache guard。
326-
- 本轮补充:microcompact disk cache loader 的 `cached`/`fromCache`/`cacheHit`/`isCached` 布尔字段现在接受 JSON bool、`true`/`false``yes`/`no``on`/`off``1`/`0` 数字/字符串形态。
326+
- 本轮补充:microcompact disk cache loader 的 `cached`/`fromCache`/`cacheHit`/`isCached` 布尔字段现在接受 JSON bool、`true`/`false``yes`/`no``on`/`off``1`/`0` 数字/字符串形态,以及 whole-number 数字字符串如 `"1.0"`/`"0.0"`
327327
- 本轮补充:microcompact disk cache loader 现在会从 `metadata`/`meta`/`cacheInfo`/`cacheDetails`/`cacheEntry`/`entry`/`record`/`cache` 等 sidecar object 中补缺失的 digest、version、cache-hit、timestamp、TTL 和 count aliases;主 summary payload 字段仍保持优先。
328328
- 本轮补充:microcompact disk cache loader 现在也接受 JSON:API/resource-style `resource`/`attributes`/`properties` wrapper,summary payload 可放在 attributes/properties 内,外层 resource `id` 可作为 digest fallback。
329329
- 本轮补充:microcompact disk cache loader 现在也递归解包 GraphQL-style `viewer`/`edge`/`node`/`attrs` wrapper,node `id` 可作为 digest fallback,attrs/properties 内的 summary、version、timestamp 和 TTL aliases 都会恢复。

docs/first-second-parity-audit.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ M6 progress now includes:
132132
- `internal/compact`: microcompact disk cache direct-payload detection now uses the same normalized summary aliases, so top-level `summary-text`, snake_case, or kebab-case summary fields still win when `data` or `payload` sidecar objects are present.
133133
- `internal/compact`: microcompact disk cache loading now fills missing cache metadata from sidecar objects such as `metadata`, `meta`, `cacheInfo`, `cacheDetails`, `cacheEntry`, `entry`, `record`, and `cache`, preserving primary result fields while recovering digest/version/cache-hit/timestamp/TTL/count aliases stored outside the summary payload.
134134
- `internal/compact`: microcompact disk cache loading and pruning now use the `<digest>.json` filename as a digest fallback when a cache entry omits an internal digest, while preserving explicit digest mismatch pruning/errors.
135-
- `internal/compact`: microcompact disk cache loading now accepts non-strict cache-hit booleans for `cached`/`fromCache`/`cacheHit`/`isCached`, including `yes`/`no`, `on`/`off`, and `1`/`0` JSON number or string values.
135+
- `internal/compact`: microcompact disk cache loading now accepts non-strict cache-hit booleans for `cached`/`fromCache`/`cacheHit`/`isCached`, including `yes`/`no`, `on`/`off`, `1`/`0` JSON number or string values, and whole-number numeric strings such as `"1.0"`/`"0.0"`.
136136
- `internal/compact`: microcompact disk cache loading now accepts JSON:API/resource-style `resource`/`attributes`/`properties` wrappers, with summary payloads inside attributes/properties and outer resource IDs used as digest fallback when needed.
137137
- `internal/compact`: microcompact disk cache loading now also recurses through GraphQL-style `viewer`/`edge`/`node`/`attrs` wrappers, preserving node IDs as digest fallback while recovering summary, version, timestamp, and TTL aliases.
138138
- `internal/compact`: microcompact disk cache loading now also traverses collection wrappers such as `edges`, `nodes`, and `included`, skipping non-cache resources without summaries while recovering GraphQL connection or JSON:API included cache entries.

internal/compact/compact_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,9 @@ func TestLoadMicroResultAcceptsAdjacentBoolCacheAliases(t *testing.T) {
523523
}{
524524
{digest: "cache-hit-string-yes", field: `"cacheHit":"yes"`, want: true},
525525
{digest: "from-cache-number-one", field: `"fromCache":1`, want: true},
526+
{digest: "from-cache-string-whole-one", field: `"fromCache":"1.0"`, want: true},
526527
{digest: "is-cached-string-no", field: `"isCached":"no"`, want: false},
528+
{digest: "cache-hit-string-whole-zero", field: `"cacheHit":"0.0"`, want: false},
527529
} {
528530
payload := fmt.Sprintf(`{
529531
"summary": %q,

internal/compact/micro.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,15 @@ func microParseJSONBool(raw json.RawMessage, field string) (bool, error) {
840840
case "false", "0", "no", "n", "off":
841841
return false, nil
842842
default:
843+
number, err := strconv.ParseFloat(strings.TrimSpace(text), 64)
844+
if err == nil {
845+
switch number {
846+
case 1:
847+
return true, nil
848+
case 0:
849+
return false, nil
850+
}
851+
}
843852
return false, fmt.Errorf("invalid bool field %q: %q", field, text)
844853
}
845854
}

0 commit comments

Comments
 (0)