@intentius/behold 0.5.0 → 0.7.0

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.
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "behold-example-flux-estate",
3
+ "private": true,
4
+ "description": "A GitOps estate for behold's flux-estate demo: a Flux control plane + two app projects, served composed.",
5
+ "workspaces": [
6
+ "control-plane",
7
+ "app-a",
8
+ "app-b"
9
+ ]
10
+ }
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+ # Tear the flux-estate demo down: delete the uniquely-named cluster and
3
+ # restore whatever kubectl context was current before estate-up.sh switched it.
4
+ set -euo pipefail
5
+ cd "$(dirname "$0")/.."
6
+
7
+ CLUSTER=behold-flux-demo
8
+ STATE="scripts/.prev-context"
9
+
10
+ k3d cluster delete "$CLUSTER" 2>/dev/null || echo "flux-estate demo: no ${CLUSTER} cluster to remove."
11
+ if [ -f "$STATE" ]; then
12
+ prev="$(cat "$STATE")"
13
+ if [ -n "$prev" ] && kubectl config get-contexts -o name 2>/dev/null | grep -qx "$prev"; then
14
+ kubectl config use-context "$prev" >/dev/null
15
+ echo "flux-estate demo: restored kubectl context \"$prev\"."
16
+ fi
17
+ rm -f "$STATE"
18
+ fi
19
+ echo "flux-estate demo: cluster removed."
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env bash
2
+ # Stand up the flux-estate demo (#211): a throwaway single-node k3d cluster,
3
+ # Flux's controllers (applied straight from the pinned release manifest — no
4
+ # flux CLI needed), and the control plane's CRs. From there the reconcilers
5
+ # deploy the app projects out of behold's public repo.
6
+ #
7
+ # Safety, same contract as example-k8s: never touches any OTHER kubeconfig
8
+ # context. Whatever context is current is saved to .prev-context and restored
9
+ # by estate-down.sh; the cluster and its context are uniquely named
10
+ # (behold-flux-demo / k3d-behold-flux-demo).
11
+ #
12
+ # BEHOLD_FLUX_REF (optional): patch the LIVE GitRepository to sync a branch
13
+ # other than main — how a not-yet-merged manifests change is verified. The
14
+ # declared source always says main.
15
+ set -euo pipefail
16
+ cd "$(dirname "$0")/.."
17
+
18
+ CLUSTER=behold-flux-demo
19
+ CONTEXT="k3d-${CLUSTER}"
20
+ STATE="scripts/.prev-context"
21
+ FLUX_MANIFEST="https://github.com/fluxcd/flux2/releases/download/v2.4.0/install.yaml"
22
+
23
+ if ! docker info >/dev/null 2>&1; then
24
+ echo "flux-estate demo: Docker is not running — start Docker and re-run." >&2
25
+ exit 1
26
+ fi
27
+ for bin in k3d kubectl; do
28
+ if ! command -v "$bin" >/dev/null 2>&1; then
29
+ echo "flux-estate demo: $bin is not installed." >&2
30
+ exit 1
31
+ fi
32
+ done
33
+
34
+ if ! k3d cluster list 2>/dev/null | grep -q "^${CLUSTER} "; then
35
+ kubectl config current-context > "$STATE" 2>/dev/null || true
36
+ k3d cluster create "$CLUSTER" --wait
37
+ else
38
+ echo "flux-estate demo: cluster ${CLUSTER} already up — reusing."
39
+ fi
40
+
41
+ echo "flux-estate demo: installing Flux controllers (${FLUX_MANIFEST##*/download/})…"
42
+ kubectl --context "$CONTEXT" apply -f "$FLUX_MANIFEST" > /dev/null
43
+ kubectl --context "$CONTEXT" -n flux-system rollout status deploy/source-controller --timeout=180s
44
+ kubectl --context "$CONTEXT" -n flux-system rollout status deploy/kustomize-controller --timeout=180s
45
+
46
+ echo "flux-estate demo: building + applying the control plane's CRs…"
47
+ (cd control-plane && npx chant build src -o dist/control-plane.yaml --format yaml)
48
+ kubectl --context "$CONTEXT" apply -f control-plane/dist/control-plane.yaml
49
+
50
+ if [ -n "${BEHOLD_FLUX_REF:-}" ]; then
51
+ echo "flux-estate demo: syncing branch ${BEHOLD_FLUX_REF} instead of main (BEHOLD_FLUX_REF)"
52
+ kubectl --context "$CONTEXT" -n flux-system patch gitrepository behold --type merge \
53
+ -p "{\"spec\":{\"ref\":{\"branch\":\"${BEHOLD_FLUX_REF}\"}}}"
54
+ fi
55
+
56
+ echo "flux-estate demo: waiting for the reconcilers to deploy the apps…"
57
+ kubectl --context "$CONTEXT" -n flux-system wait --for=condition=Ready --timeout=180s gitrepository/behold
58
+ kubectl --context "$CONTEXT" -n flux-system wait --for=condition=Ready --timeout=180s kustomization/app-a kustomization/app-b
59
+ kubectl --context "$CONTEXT" -n app-a rollout status deploy/app-a --timeout=180s
60
+ kubectl --context "$CONTEXT" -n app-b rollout status deploy/app-b --timeout=180s
61
+ echo "flux-estate demo: up — Flux deployed both apps from the repo."
@@ -6,9 +6,9 @@
6
6
  "": {
7
7
  "name": "behold-example-k8s",
8
8
  "dependencies": {
9
- "@intentius/chant": "^0.32.0",
10
- "@intentius/chant-lexicon-k8s": "^0.32.0",
11
- "@intentius/chant-lexicon-temporal": "^0.32.0"
9
+ "@intentius/chant": "^0.44.2",
10
+ "@intentius/chant-lexicon-k8s": "^0.44.2",
11
+ "@intentius/chant-lexicon-temporal": "^0.44.2"
12
12
  }
13
13
  },
14
14
  "node_modules/@dagrejs/dagre": {
@@ -443,9 +443,9 @@
443
443
  }
444
444
  },
445
445
  "node_modules/@intentius/chant": {
446
- "version": "0.32.0",
447
- "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.32.0.tgz",
448
- "integrity": "sha512-U+wnypMgidM/SS6nA0vff+8KP6KBeZL5+0laeU3slhnCUU+zFKIg6NxFZcxsZE81P/VFOPstZnSMU9KUqcwjvg==",
446
+ "version": "0.44.2",
447
+ "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.44.2.tgz",
448
+ "integrity": "sha512-qGt/eAteVO6R6UGDEo7QdlRL48lOiTnjYc58OLrxMfDJ1nxzQaDa68H7UnGytApQ1mOdLcEsK60lX8vnYYg0Nw==",
449
449
  "license": "Apache-2.0",
450
450
  "dependencies": {
451
451
  "@dagrejs/dagre": "^3.0.0",
@@ -461,9 +461,9 @@
461
461
  }
462
462
  },
463
463
  "node_modules/@intentius/chant-k8s-client": {
464
- "version": "0.32.0",
465
- "resolved": "https://registry.npmjs.org/@intentius/chant-k8s-client/-/chant-k8s-client-0.32.0.tgz",
466
- "integrity": "sha512-I4bwNqvzfrEgjY9ZM7Ya73xLaDbgS1zzKza4gtwod4au7jpD+5kO22Pb+NAFgMb6c+kxgApaWFC3OVD1ewJpbg==",
464
+ "version": "0.44.2",
465
+ "resolved": "https://registry.npmjs.org/@intentius/chant-k8s-client/-/chant-k8s-client-0.44.2.tgz",
466
+ "integrity": "sha512-97r6hXTwnSw2f2CDFCaBoKOs6J1VHj2l59vTvQ5Q+HFq1XPADilmRAcAq5vbcFFkIZbfbAe4JiRbMls0ATDW2w==",
467
467
  "license": "Apache-2.0",
468
468
  "optional": true,
469
469
  "dependencies": {
@@ -471,33 +471,36 @@
471
471
  }
472
472
  },
473
473
  "node_modules/@intentius/chant-lexicon-k8s": {
474
- "version": "0.32.0",
475
- "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-k8s/-/chant-lexicon-k8s-0.32.0.tgz",
476
- "integrity": "sha512-47MJBS1g9BvP+J5rZ0HdCNtdKyU31O9cpLG3VqyiP/Q5YhJeLgrLbPFwAzphCUmEFMswuK+LXAiS3Vu/HXuXYQ==",
474
+ "version": "0.44.2",
475
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-k8s/-/chant-lexicon-k8s-0.44.2.tgz",
476
+ "integrity": "sha512-w3OycY5D/dez3J+7L0NjxcEA4AjAVhfZHC9jeawei+vWo2cbN74H8RKRqS3WHdyqiaBWlyiJRuI+8lJxEVSzUA==",
477
477
  "license": "Apache-2.0",
478
478
  "dependencies": {
479
479
  "@types/js-yaml": "^4.0.9",
480
480
  "js-yaml": "^4.1.1"
481
481
  },
482
482
  "optionalDependencies": {
483
- "@intentius/chant-k8s-client": "^0.32.0"
483
+ "@intentius/chant-k8s-client": "^0.44.2"
484
484
  },
485
485
  "peerDependencies": {
486
- "@intentius/chant": "^0.32.0",
487
- "typescript": "^5.9.3"
486
+ "@intentius/chant": "^0.44.2",
487
+ "typescript": "^5.9.3",
488
+ "zod": "^4.3.6"
488
489
  }
489
490
  },
490
491
  "node_modules/@intentius/chant-lexicon-temporal": {
491
- "version": "0.32.0",
492
- "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-temporal/-/chant-lexicon-temporal-0.32.0.tgz",
493
- "integrity": "sha512-A/JEV3dwgNp1RcguWWGxYUfwx/7nQ3btHtFoqHJVJ3zZo9qodpDCTOTHNDJrM1yuq6sCp22I0gJeS4ZkdDS2Tg==",
492
+ "version": "0.44.2",
493
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-temporal/-/chant-lexicon-temporal-0.44.2.tgz",
494
+ "integrity": "sha512-0sHR116Z7mDRgJZudNGgITJs4GDwU5fLgOM6ruJ2u1uIehCd1CYGJ1P7nWtetr4FHfM9vn022iLuO194rvkwcA==",
494
495
  "license": "Apache-2.0",
495
496
  "dependencies": {
496
- "@temporalio/common": "^1.17.2"
497
+ "@temporalio/common": "^1.17.2",
498
+ "js-yaml": "^4.1.1"
497
499
  },
498
500
  "peerDependencies": {
499
- "@intentius/chant": "^0.32.0",
500
- "typescript": "^5.9.3"
501
+ "@intentius/chant": "^0.44.2",
502
+ "typescript": "^5.9.3",
503
+ "zod": "^4.3.6"
501
504
  }
502
505
  },
503
506
  "node_modules/@jsep-plugin/assignment": {
@@ -727,9 +730,9 @@
727
730
  }
728
731
  },
729
732
  "node_modules/bare-fs": {
730
- "version": "4.7.4",
731
- "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.4.tgz",
732
- "integrity": "sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==",
733
+ "version": "4.8.0",
734
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.0.tgz",
735
+ "integrity": "sha512-fM+MhCvdQhZ7NV6S95a07gPSqjIYKn6mFaXfx266wN3ajZGl/+1AzH+ubkXQ0fFZvOe2nk9VHkzdYkQE5zMV3Q==",
733
736
  "license": "Apache-2.0",
734
737
  "optional": true,
735
738
  "dependencies": {
@@ -740,7 +743,7 @@
740
743
  "fast-fifo": "^1.3.2"
741
744
  },
742
745
  "engines": {
743
- "bare": ">=1.16.0"
746
+ "bare": ">=1.28.0"
744
747
  },
745
748
  "peerDependencies": {
746
749
  "bare-buffer": "*"
@@ -787,9 +790,9 @@
787
790
  }
788
791
  },
789
792
  "node_modules/bare-url": {
790
- "version": "2.4.6",
791
- "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.6.tgz",
792
- "integrity": "sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==",
793
+ "version": "2.5.1",
794
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.1.tgz",
795
+ "integrity": "sha512-cD5ciQuKlx+eumTCfqbfiL+fhQm+dHbVNB/cX4+d+I/nx4JsVop9VoFEPAs5RJ6I84QR6bZIBjpd2kjDOYeWcg==",
793
796
  "license": "Apache-2.0",
794
797
  "optional": true,
795
798
  "dependencies": {
@@ -1142,9 +1145,9 @@
1142
1145
  }
1143
1146
  },
1144
1147
  "node_modules/ip-address": {
1145
- "version": "10.3.1",
1146
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.3.1.tgz",
1147
- "integrity": "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==",
1148
+ "version": "10.4.0",
1149
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz",
1150
+ "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==",
1148
1151
  "license": "MIT",
1149
1152
  "optional": true,
1150
1153
  "engines": {
@@ -1162,9 +1165,9 @@
1162
1165
  }
1163
1166
  },
1164
1167
  "node_modules/jose": {
1165
- "version": "6.2.4",
1166
- "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.4.tgz",
1167
- "integrity": "sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA==",
1168
+ "version": "6.2.8",
1169
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.8.tgz",
1170
+ "integrity": "sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ==",
1168
1171
  "license": "MIT",
1169
1172
  "optional": true,
1170
1173
  "funding": {
@@ -1172,9 +1175,9 @@
1172
1175
  }
1173
1176
  },
1174
1177
  "node_modules/js-yaml": {
1175
- "version": "4.3.0",
1176
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
1177
- "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
1178
+ "version": "4.3.1",
1179
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz",
1180
+ "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==",
1178
1181
  "funding": [
1179
1182
  {
1180
1183
  "type": "github",
@@ -2037,9 +2040,9 @@
2037
2040
  "optional": true
2038
2041
  },
2039
2042
  "node_modules/ws": {
2040
- "version": "8.21.1",
2041
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz",
2042
- "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==",
2043
+ "version": "8.21.3",
2044
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
2045
+ "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
2043
2046
  "license": "MIT",
2044
2047
  "optional": true,
2045
2048
  "engines": {
@@ -2,13 +2,13 @@
2
2
  "name": "behold-example-k8s",
3
3
  "private": true,
4
4
  "type": "module",
5
- "description": "A small nginx Deployment+Service on k3d behold's k3d turnkey demo (#88), the Kubernetes counterpart to Loom-on-Floci.",
5
+ "description": "A small nginx Deployment+Service on k3d \u2014 behold's k3d turnkey demo (#88), the Kubernetes counterpart to Loom-on-Floci.",
6
6
  "scripts": {
7
7
  "build": "./node_modules/.bin/chant build src --lexicon k8s -o app.yaml"
8
8
  },
9
9
  "dependencies": {
10
- "@intentius/chant": "^0.32.0",
11
- "@intentius/chant-lexicon-k8s": "^0.32.0",
12
- "@intentius/chant-lexicon-temporal": "^0.32.0"
10
+ "@intentius/chant": "^0.44.2",
11
+ "@intentius/chant-lexicon-k8s": "^0.44.2",
12
+ "@intentius/chant-lexicon-temporal": "^0.44.2"
13
13
  }
14
14
  }
@@ -6,9 +6,9 @@
6
6
  "": {
7
7
  "name": "behold-example-writes",
8
8
  "dependencies": {
9
- "@intentius/chant": "^0.32.0",
10
- "@intentius/chant-lexicon-aws": "^0.32.0",
11
- "@intentius/chant-lexicon-temporal": "^0.32.0"
9
+ "@intentius/chant": "^0.44.2",
10
+ "@intentius/chant-lexicon-aws": "^0.44.2",
11
+ "@intentius/chant-lexicon-temporal": "^0.44.2"
12
12
  }
13
13
  },
14
14
  "node_modules/@dagrejs/dagre": {
@@ -443,9 +443,9 @@
443
443
  }
444
444
  },
445
445
  "node_modules/@intentius/chant": {
446
- "version": "0.32.0",
447
- "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.32.0.tgz",
448
- "integrity": "sha512-U+wnypMgidM/SS6nA0vff+8KP6KBeZL5+0laeU3slhnCUU+zFKIg6NxFZcxsZE81P/VFOPstZnSMU9KUqcwjvg==",
446
+ "version": "0.44.2",
447
+ "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.44.2.tgz",
448
+ "integrity": "sha512-qGt/eAteVO6R6UGDEo7QdlRL48lOiTnjYc58OLrxMfDJ1nxzQaDa68H7UnGytApQ1mOdLcEsK60lX8vnYYg0Nw==",
449
449
  "license": "Apache-2.0",
450
450
  "dependencies": {
451
451
  "@dagrejs/dagre": "^3.0.0",
@@ -461,30 +461,32 @@
461
461
  }
462
462
  },
463
463
  "node_modules/@intentius/chant-lexicon-aws": {
464
- "version": "0.32.0",
465
- "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-aws/-/chant-lexicon-aws-0.32.0.tgz",
466
- "integrity": "sha512-+hebdJ9RxexbMDl4bxG8To4C67qiYD1XEZ6V2i8o+txDUEmBph81Hdpjqf7Z/3x2yg9lDUX4qoFkQpjzmvxUog==",
464
+ "version": "0.44.2",
465
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-aws/-/chant-lexicon-aws-0.44.2.tgz",
466
+ "integrity": "sha512-TPlq70LqLB8KRYLup8njKJeLbQyjofVTvQy892HI2RkacyAohhWj65hxIDH7zbEbnONbfJpolxyaicAzDXmnuw==",
467
467
  "license": "Apache-2.0",
468
468
  "dependencies": {
469
469
  "fflate": "^0.8.2",
470
470
  "js-yaml": "^4.1.0"
471
471
  },
472
472
  "peerDependencies": {
473
- "@intentius/chant": "^0.32.0",
473
+ "@intentius/chant": "^0.44.2",
474
474
  "typescript": "^5.9.3"
475
475
  }
476
476
  },
477
477
  "node_modules/@intentius/chant-lexicon-temporal": {
478
- "version": "0.32.0",
479
- "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-temporal/-/chant-lexicon-temporal-0.32.0.tgz",
480
- "integrity": "sha512-A/JEV3dwgNp1RcguWWGxYUfwx/7nQ3btHtFoqHJVJ3zZo9qodpDCTOTHNDJrM1yuq6sCp22I0gJeS4ZkdDS2Tg==",
478
+ "version": "0.44.2",
479
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-temporal/-/chant-lexicon-temporal-0.44.2.tgz",
480
+ "integrity": "sha512-0sHR116Z7mDRgJZudNGgITJs4GDwU5fLgOM6ruJ2u1uIehCd1CYGJ1P7nWtetr4FHfM9vn022iLuO194rvkwcA==",
481
481
  "license": "Apache-2.0",
482
482
  "dependencies": {
483
- "@temporalio/common": "^1.17.2"
483
+ "@temporalio/common": "^1.17.2",
484
+ "js-yaml": "^4.1.1"
484
485
  },
485
486
  "peerDependencies": {
486
- "@intentius/chant": "^0.32.0",
487
- "typescript": "^5.9.3"
487
+ "@intentius/chant": "^0.44.2",
488
+ "typescript": "^5.9.3",
489
+ "zod": "^4.3.6"
488
490
  }
489
491
  },
490
492
  "node_modules/@protobufjs/aspromise": {
@@ -7,8 +7,8 @@
7
7
  "build": "./node_modules/.bin/chant build src --lexicon aws -o template.json"
8
8
  },
9
9
  "dependencies": {
10
- "@intentius/chant": "^0.32.0",
11
- "@intentius/chant-lexicon-aws": "^0.32.0",
12
- "@intentius/chant-lexicon-temporal": "^0.32.0"
10
+ "@intentius/chant": "^0.44.2",
11
+ "@intentius/chant-lexicon-aws": "^0.44.2",
12
+ "@intentius/chant-lexicon-temporal": "^0.44.2"
13
13
  }
14
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intentius/behold",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "description": "behold — a live control plane on chant. See your whole estate (every substrate in one graph), coloured by drift; act through delegated, gated Ops.",
6
6
  "bin": {
@@ -12,6 +12,7 @@
12
12
  "web",
13
13
  "example-writes",
14
14
  "example-k8s",
15
+ "example-flux-estate",
15
16
  "demos.json",
16
17
  "AGENTS.md"
17
18
  ],
package/web/app.js CHANGED
@@ -460,6 +460,16 @@ function renderDiff(panel, diff) {
460
460
  const cat = document.createElement("p");
461
461
  cat.textContent = DIFF_LABEL[diff.category] || diff.category;
462
462
  panel.appendChild(cat);
463
+ // chant#1620 (#192): where the live read actually looked — the line that
464
+ // separates "not there" from "looked in the wrong place" (a declared k8s
465
+ // object with no namespace reads from the DEFAULTED namespace, and only
466
+ // this address makes that visible). Monospace so a request path scans.
467
+ if (diff.queried) {
468
+ const q = document.createElement("p");
469
+ q.style.cssText = "color:var(--muted);font:11px/1.4 ui-monospace,monospace;overflow-wrap:anywhere;margin-top:2px";
470
+ q.textContent = `queried: ${diff.queried} → ${diff.category === "missing" ? "not found" : "read failed"}`;
471
+ panel.appendChild(q);
472
+ }
463
473
  // chant#1168 (#1089): show WHY chant couldn't look, instead of the
464
474
  // "no field changes" text below — that phrasing implies a comparison ran
465
475
  // and found nothing, which is exactly the wrong read for a hole in the