Spaces:
Running
Running
Add 48-surface evidence passports and safe accessible navigation
#2
by betterwithage - opened
- Dockerfile +1 -2
- killinchu_elite_console.py +21 -0
- killinchu_experience.py +227 -0
- serve.py +11 -0
- tests/test_killinchu_experience_contract.py +68 -0
Dockerfile
CHANGED
|
@@ -112,7 +112,7 @@ COPY cathedral.html knowledge.json operator_shell_v4.py serve.py szl_evidence_re
|
|
| 112 |
# falls back and /spaces + /api/<ns>/v1/spaces/health 404. Byte-identical a11oy+killinchu.
|
| 113 |
COPY szl_spaces_proxy.py szl_spaces_surface.py ./
|
| 114 |
COPY szl_live_wires.py live_wires.html live_wires_3d.js szl_rosie_companion.py killinchu_szl_pqc_sign.py szl_rekor.py killinchu_osint.py szl_be_hardening.py szl_unay.py szl_khipu_lmdb.py szl_khipu_replicate.py szl_unay_routes.py szl_warhacker_aliases.py killinchu_genius.py killinchu_warhacker_demos.py killinchu_v3.py szl_brain.py szl_rag.py szl_formulas.py szl_understudy.py ./
|
| 115 |
-
COPY szl_killinchu_cookbook.py szl_uds_hardening.py killinchu_fusion.py szl_v4_fleet.py szl_ken.py killinchu_frontier_patch.py killinchu_drone_routes.py killinchu_parity.py killinchu_cannonico.py killinchu_elite_console.py _vendor_blobs.py killinchu_fleet_vessels.py killinchu_maritime_risk.py killinchu_maritime_intel.py killinchu_maritime_view.py killinchu_live_feeds.py killinchu_feeds_realdata.py killinchu_asw.py killinchu_anatomy.py killinchu_health_twin.py fleet_vessels_data.json killinchu_beyond.py szl_khipu_consensus.py killinchu_mesh.py killinchu_mesh_view.py killinchu_formula_endpoints.py killinchu_edge_formulas.py killinchu_active_flux.py killinchu_platform_dynamics.py ./
|
| 116 |
COPY killinchu_edge_console.py szl_agentic_loop.py szl_anatomy_routes.py szl_formula_wiring.py a11oy_code_engine.py killinchu_ops_control.py szl_llm_registry.py szl_alloy_models.py a11oy_agent_loop.py a11oy_org_rag.py a11oy_mcp_client.py killinchu_mined_ops.py killinchu_resweep_ops.py killinchu_wave910.py killinchu_posture_topology.py szl_connectors_serve.py szl_connector_mcp.py szl_scaling.py szl_allodial.py szl_entanglement.py szl_neuroplasticity.py szl_chain_of_title.py ./
|
| 117 |
# Wave 15 frontier organs (Dynamic Linear Attention, Context-Ready Transformer, OPERA perplexity-reward).
|
| 118 |
COPY szl_dla.py szl_ctxready.py szl_opera.py ./
|
|
@@ -702,4 +702,3 @@ CMD ["python", "serve.py"]
|
|
| 702 |
# Build cache-bust 2026-06-07T05:00Z (MINED ops squad): COPY killinchu_mined_ops.py
|
| 703 |
# into /app so serve.py can import+register the 4 mined operational/efficiency surfaces.
|
| 704 |
|
| 705 |
-
|
|
|
|
| 112 |
# falls back and /spaces + /api/<ns>/v1/spaces/health 404. Byte-identical a11oy+killinchu.
|
| 113 |
COPY szl_spaces_proxy.py szl_spaces_surface.py ./
|
| 114 |
COPY szl_live_wires.py live_wires.html live_wires_3d.js szl_rosie_companion.py killinchu_szl_pqc_sign.py szl_rekor.py killinchu_osint.py szl_be_hardening.py szl_unay.py szl_khipu_lmdb.py szl_khipu_replicate.py szl_unay_routes.py szl_warhacker_aliases.py killinchu_genius.py killinchu_warhacker_demos.py killinchu_v3.py szl_brain.py szl_rag.py szl_formulas.py szl_understudy.py ./
|
| 115 |
+
COPY szl_killinchu_cookbook.py szl_uds_hardening.py killinchu_fusion.py szl_v4_fleet.py szl_ken.py killinchu_frontier_patch.py killinchu_drone_routes.py killinchu_parity.py killinchu_cannonico.py killinchu_elite_console.py killinchu_experience.py _vendor_blobs.py killinchu_fleet_vessels.py killinchu_maritime_risk.py killinchu_maritime_intel.py killinchu_maritime_view.py killinchu_live_feeds.py killinchu_feeds_realdata.py killinchu_asw.py killinchu_anatomy.py killinchu_health_twin.py fleet_vessels_data.json killinchu_beyond.py szl_khipu_consensus.py killinchu_mesh.py killinchu_mesh_view.py killinchu_formula_endpoints.py killinchu_edge_formulas.py killinchu_active_flux.py killinchu_platform_dynamics.py ./
|
| 116 |
COPY killinchu_edge_console.py szl_agentic_loop.py szl_anatomy_routes.py szl_formula_wiring.py a11oy_code_engine.py killinchu_ops_control.py szl_llm_registry.py szl_alloy_models.py a11oy_agent_loop.py a11oy_org_rag.py a11oy_mcp_client.py killinchu_mined_ops.py killinchu_resweep_ops.py killinchu_wave910.py killinchu_posture_topology.py szl_connectors_serve.py szl_connector_mcp.py szl_scaling.py szl_allodial.py szl_entanglement.py szl_neuroplasticity.py szl_chain_of_title.py ./
|
| 117 |
# Wave 15 frontier organs (Dynamic Linear Attention, Context-Ready Transformer, OPERA perplexity-reward).
|
| 118 |
COPY szl_dla.py szl_ctxready.py szl_opera.py ./
|
|
|
|
| 702 |
# Build cache-bust 2026-06-07T05:00Z (MINED ops squad): COPY killinchu_mined_ops.py
|
| 703 |
# into /app so serve.py can import+register the 4 mined operational/efficiency surfaces.
|
| 704 |
|
|
|
killinchu_elite_console.py
CHANGED
|
@@ -319,6 +319,27 @@ def register(
|
|
| 319 |
if "__SZL_CEO_OVERLAY__" not in html:
|
| 320 |
html = html.replace("</body>", _CEO_OVERLAY_HTML + "\n</body>", 1)
|
| 321 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 322 |
async def _serve_console() -> HTMLResponse:
|
| 323 |
return HTMLResponse(html)
|
| 324 |
|
|
|
|
| 319 |
if "__SZL_CEO_OVERLAY__" not in html:
|
| 320 |
html = html.replace("</body>", _CEO_OVERLAY_HTML + "\n</body>", 1)
|
| 321 |
|
| 322 |
+
# Add the shared data/evidence passport after the investor overlay. The
|
| 323 |
+
# layer is deliberately read-only: it probes allow-listed GET routes only,
|
| 324 |
+
# never triggers the POST-only decoder/mission/receipt surfaces, and makes
|
| 325 |
+
# runtime-injected nav items keyboard accessible.
|
| 326 |
+
try:
|
| 327 |
+
from killinchu_experience import EXPERIENCE_LAYER_HTML
|
| 328 |
+
|
| 329 |
+
if "__KILLINCHU_EXPERIENCE_LAYER_V1__" not in html:
|
| 330 |
+
html = html.replace(
|
| 331 |
+
"</body>",
|
| 332 |
+
EXPERIENCE_LAYER_HTML.replace("__NS__", ns) + "\n</body>",
|
| 333 |
+
1,
|
| 334 |
+
)
|
| 335 |
+
except Exception as _experience_layer_error: # pragma: no cover - fail soft
|
| 336 |
+
import sys as _sys
|
| 337 |
+
|
| 338 |
+
print(
|
| 339 |
+
f"[killinchu] experience layer skipped: {_experience_layer_error!r}",
|
| 340 |
+
file=_sys.stderr,
|
| 341 |
+
)
|
| 342 |
+
|
| 343 |
async def _serve_console() -> HTMLResponse:
|
| 344 |
return HTMLResponse(html)
|
| 345 |
|
killinchu_experience.py
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: Apache-2.0
|
| 2 |
+
"""Killinchu experience manifest and operator-facing evidence passport.
|
| 3 |
+
|
| 4 |
+
This module does not execute missions, emit receipts, mutate policies, or call
|
| 5 |
+
external services. It publishes the declared contract for every discoverable
|
| 6 |
+
surface and supplies a small, accessible UI layer for ``/elite``. The browser
|
| 7 |
+
layer probes only explicitly allow-listed GET endpoints; POST-only capabilities
|
| 8 |
+
stay labelled ON_DEMAND and are never auto-run.
|
| 9 |
+
"""
|
| 10 |
+
from __future__ import annotations
|
| 11 |
+
|
| 12 |
+
from collections import Counter
|
| 13 |
+
from datetime import datetime, timezone
|
| 14 |
+
from typing import TYPE_CHECKING, Any
|
| 15 |
+
|
| 16 |
+
if TYPE_CHECKING: # keep the manifest importable in lightweight audit tooling
|
| 17 |
+
from fastapi import FastAPI
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
def _surface(
|
| 21 |
+
key: str,
|
| 22 |
+
label: str,
|
| 23 |
+
purpose: str,
|
| 24 |
+
endpoint: str,
|
| 25 |
+
data_state: str,
|
| 26 |
+
evidence_state: str,
|
| 27 |
+
boundary: str,
|
| 28 |
+
investor_value: str,
|
| 29 |
+
*,
|
| 30 |
+
visibility: str = "primary",
|
| 31 |
+
kind: str = "view",
|
| 32 |
+
method: str = "GET",
|
| 33 |
+
safe_probe: bool = True,
|
| 34 |
+
) -> dict[str, Any]:
|
| 35 |
+
route = endpoint if kind == "route" else f"/elite#{key}"
|
| 36 |
+
return {
|
| 37 |
+
"id": key,
|
| 38 |
+
"label": label,
|
| 39 |
+
"route": route,
|
| 40 |
+
"kind": kind,
|
| 41 |
+
"visibility": visibility,
|
| 42 |
+
"purpose": purpose,
|
| 43 |
+
"source": {
|
| 44 |
+
"endpoint": endpoint,
|
| 45 |
+
"method": method,
|
| 46 |
+
"safe_probe": bool(safe_probe and method == "GET" and endpoint.startswith("/api/")),
|
| 47 |
+
},
|
| 48 |
+
"data_state": data_state,
|
| 49 |
+
"evidence_state": evidence_state,
|
| 50 |
+
"operational_boundary": boundary,
|
| 51 |
+
"investor_value": investor_value,
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
EXPERIENCE_SURFACES: tuple[dict[str, Any], ...] = (
|
| 56 |
+
# Primary operator views present in the server-rendered /elite navigation.
|
| 57 |
+
_surface("hero_interdiction", "Provable Interdiction", "Trace a governed recommendation from ROE policy through a receipt to its proof references.", "/api/killinchu/v1/roe/policy", "MIXED", "formal_plus_runtime", "Recommendation only; no autonomous or kinetic actuation. Receipt signing may be unavailable and must remain explicit.", "Turns autonomy assurance into inspectable evidence rather than a trust claim."),
|
| 58 |
+
_surface("tracks", "Live Track Board", "Present the current air and maritime watch picture with provenance.", "/api/killinchu/v1/threats/active", "LIVE_OR_SAMPLE", "public_source", "Passive situational awareness; tracks are leads, not targeting truth.", "A legible operational wedge grounded in real public telemetry."),
|
| 59 |
+
_surface("u_warhacker", "Demo Suite", "Index governed counter-UAS and maritime demonstrations with proof and tamper modes.", "/api/killinchu/v1/warhacker/index", "LIVE_COMPUTE", "runtime", "Catalog lookup only; launches are POST-only demonstrations and are never auto-run.", "A repeatable buyer-facing proof suite instead of a scripted video."),
|
| 60 |
+
_surface("dataset_control", "Data Sources / Overlays", "Show which feeds and bounded reference datasets are wired and selectable.", "/api/killinchu/v1/feeds/status", "LIVE_OR_SNAPSHOT", "public_source", "Source selection is advisory and must never relabel a sample as live.", "Makes data lineage and deployment gaps visible to diligence teams.", visibility="retired_from_nav"),
|
| 61 |
+
_surface("fleet_c2", "Fleet Health & Governed C2", "Combine aircraft and vessel telemetry with inferred subsystem health.", "/api/killinchu/v1/twin/platforms", "MIXED", "mixed", "Health is inferred from telemetry; command output is a simulated demonstration.", "Shows a governed common operating picture without pretending to control assets."),
|
| 62 |
+
_surface("decoders", "Protocol Decoders", "Decode captured Remote ID, ADS-B, and MAVLink frames into claimed identities.", "/api/killinchu/v1/remote-id/decode", "ON_DEMAND", "runtime", "POST-only and never auto-run; broadcast identities are unauthenticated claims.", "Demonstrates protocol fluency while preserving evidence boundaries.", method="POST", safe_probe=False),
|
| 63 |
+
_surface("u_assurance", "Assurance", "Expose tamper evidence, deterministic replay measurement, readiness, and UDS posture.", "/api/killinchu/uds/v1/healthz", "LIVE_RUNTIME", "mixed", "Readiness and package mappings are evidence, not certifications or authorizations.", "Packages the trust story for technical diligence and regulated buyers."),
|
| 64 |
+
_surface("u_maritime", "Maritime Picture", "Fuse public AIS with sanctions, dark-vessel, and risk overlays.", "/api/killinchu/v1/ais/live", "LIVE_OR_SAMPLE", "public_source", "AIS and screening results are advisory public-source claims.", "Extends the same governed substrate from air to sea."),
|
| 65 |
+
_surface("u_space", "Constellations & GEOINT", "Display screening-grade public orbital data and collection-planning estimates.", "/api/killinchu/v1/sda/propagate?group=stations", "LIVE_OR_SNAPSHOT", "public_source", "Screening-grade only; not a calibrated catalog, conjunction service, or tasking authority.", "Shows cross-domain expansion without overstating orbital precision."),
|
| 66 |
+
_surface("u_swarm", "Swarm Integrity", "Render topology, intent heuristics, and resilience of grouped tracks.", "/api/killinchu/v1/swarm/topology", "MIXED", "modeled", "Intent is heuristic; topology does not authorize effects.", "Makes multi-agent integrity and graceful degradation tangible."),
|
| 67 |
+
_surface("u_engage", "Engage & ROE", "Inspect the governed recommendation loop and rules of engagement.", "/api/killinchu/v1/roe/policy", "LIVE_RUNTIME", "runtime", "Human-in-the-loop; kinetic and active RF effects are outside this surface.", "Shows policy-controlled autonomy with an explicit authority boundary."),
|
| 68 |
+
_surface("u_fusion", "Sensor-Fusion", "Expose multi-sensor state fusion and its uncertainty math.", "/api/killinchu/v1/sensor-fusion/status", "LIVE_OR_SAMPLE", "formal_plus_runtime", "Fusion reduces uncertainty but does not turn public telemetry into attested truth.", "Connects operational data to inspectable mathematical guarantees."),
|
| 69 |
+
_surface("u_minedops", "Mined Ops", "Estimate field compute, telemetry memory, sampling, and routing tradeoffs.", "/api/killinchu/v1/mined/index", "MODELED", "modeled", "Engineering estimates only; no hardware or network settings are changed.", "Frames edge efficiency as an auditable deployment advantage.", visibility="retired_from_nav"),
|
| 70 |
+
_surface("lambda", "Trust Score Monitor", "Inspect the 13-axis advisory trust score and its inputs.", "/api/killinchu/v1/honest", "CONJECTURE", "declared", "Lambda is Conjecture 1 and must never be treated as a theorem or pass/fail oracle.", "A differentiated trust vocabulary with the maturity caveat visible."),
|
| 71 |
+
_surface("u_consensus", "Mesh Resilience", "Show quorum, connectivity, and conditional agreement evidence.", "/api/killinchu/uds/v1/healthz", "CONDITIONAL", "formal_plus_runtime", "Unconditional Byzantine safety remains open; no autonomous authority is conferred.", "Demonstrates resilient coordination with honest proof scope."),
|
| 72 |
+
_surface("u_posture", "Posture, Topology & Zero-Trust", "Measure drift, graph health, exposure, and declared mesh policy.", "/api/killinchu/v1/topology/health", "LIVE_OR_SNAPSHOT", "mixed", "Posture findings are advisory; absent telemetry must remain unknown.", "Creates a continuous-assurance view for deployment owners."),
|
| 73 |
+
_surface("u_receipts", "Receipts & Provenance", "Browse the runtime receipt ledger and verify provenance state.", "/api/killinchu/v1/receipt/ledger", "LIVE_RUNTIME", "runtime", "Unsigned or placeholder state must remain explicit; a signature attests content, not truth.", "Provides the evidence plane that links every product claim."),
|
| 74 |
+
_surface("u_proofs", "Knowledge & Runtime Proofs", "Connect formulas, theorem cards, and runtime gates.", "/api/killinchu/v1/formulas/index", "PROVEN_PLUS_OPEN", "formal_plus_runtime", "Locked, experimental, conditional, and conjectural results must remain distinct.", "Makes the research moat inspectable by technical investors."),
|
| 75 |
+
_surface("u_melt", "Observability (MELT)", "Expose metrics, events, logs, traces, and receipt linkage.", "/api/killinchu/v1/melt/summary", "LIVE_RUNTIME", "runtime", "Telemetry freshness and missing spans must be shown, not inferred.", "Gives operators and buyers one accountability plane.", visibility="retired_from_nav"),
|
| 76 |
+
_surface("u_about", "About & Claims", "State deployment posture, research lineage, and legal boundaries.", "/api/killinchu/v1/honest", "DOCUMENTED", "declared", "Claims are not certifications; roadmap items must remain roadmap.", "A diligence-ready narrative with falsifiable claims.", visibility="retired_from_nav"),
|
| 77 |
+
_surface("u_intel", "OSINT / Threat Intel", "Normalize public cyber, maritime, procurement, geopolitical, and counter-UAS reporting.", "/api/killinchu/v1/feeds/status", "LIVE_OR_CACHED", "public_source", "Third-party claims and heuristic tags are advisory, not attested intelligence.", "Turns fragmented public signals into a governed, provenance-aware watchlist."),
|
| 78 |
+
_surface("u_operator", "Operator OSINT", "Rank, route, correlate, and graph the OSINT corpus.", "/api/killinchu/v1/operator/digest", "LIVE_OR_CACHED", "modeled", "Ranking and entity extraction are heuristic; operator review remains required.", "Shows the product loop from data intake to explainable decision support."),
|
| 79 |
+
_surface("cuas_lab", "Counter-UAS C2 Lab", "Explore intercept, spoof, triage, fusion, and provenance experiments.", "/api/killinchu/v1/cuas/summary", "MODELED", "modeled", "Experimental and simulated; effectors never actuate.", "A controlled frontier lab without confusing prototypes for field authority.", visibility="retired_from_nav"),
|
| 80 |
+
_surface("scaling", "Metabolic Scaling", "Explore cited allometric and compute-scaling analogies.", "/api/killinchu/v1/scaling/summary", "MODELED", "modeled", "Engineering analogies and proposed gates are not the formal Lambda theorem.", "Connects efficiency research to the sovereign-compute thesis.", visibility="retired_from_nav"),
|
| 81 |
+
|
| 82 |
+
# Runtime-injected views.
|
| 83 |
+
_surface("mosaic", "Nawi / Domain-Superiority", "Fuse the common operating picture with an anomaly overlay and receipt verifier.", "/api/killinchu/v1/mosaic/health", "MIXED", "mixed", "Space conjunction is roadmap; anomaly and risk outputs are advisory.", "An original cross-domain command picture with evidence built in.", visibility="runtime"),
|
| 84 |
+
_surface("conjecturefactory", "Conjecture Factory", "Display signed disclosures of open conjectures and bounded-solver grades.", "/api/killinchu/v1/conjecture-factory", "OPEN", "declared", "A signature attests timestamp and content, never mathematical truth.", "Demonstrates a disciplined research pipeline that preserves uncertainty.", visibility="hidden_r_and_d"),
|
| 85 |
+
_surface("sovereignty", "Sovereignty (Allodial)", "Explain operator ownership and control through cited governance models.", "/api/killinchu/v1/allodial/summary", "PROPOSED", "modeled", "A governance metaphor, not a claim to be above lawful authority.", "Clarifies the commercial sovereignty thesis for buyers and investors.", visibility="hidden_r_and_d"),
|
| 86 |
+
_surface("neuro", "Neuroplasticity", "Visualize cited learning-rule and loss-of-plasticity diagnostics.", "/api/killinchu/v1/neuro/summary", "MODELED", "modeled", "Biological analogies and proposed lenses are not Lambda proofs.", "Links continual-learning research to agent reliability.", visibility="hidden_r_and_d"),
|
| 87 |
+
_surface("l6chain", "Chain of Title", "Bind software, science, and math references into an inspectable artifact record.", "/api/killinchu/v1/chain/summary", "PROPOSED", "mixed", "Signing and DOI minting remain founder-gated; structural verification is not cryptographic verification.", "A compelling long-horizon provenance product thesis.", visibility="hidden_r_and_d"),
|
| 88 |
+
_surface("entangle", "Entanglement", "Explore cited quantum-information bounds and engineering analogies.", "/api/killinchu/v1/entangle/summary", "MIXED", "formal_plus_runtime", "Rigorously cited pieces, structural analogies, and speculative claims stay separately tiered.", "Shows research breadth while preserving proof boundaries.", visibility="hidden_r_and_d"),
|
| 89 |
+
_surface("atlas", "Formula Atlas", "Index the five engineering formula modules and their honest tiers.", "/api/killinchu/v1/unified/summary", "DOCUMENTED", "mixed", "An index does not promote experimental results into the locked set.", "Creates a single diligence entry point for the research estate.", visibility="hidden_r_and_d"),
|
| 90 |
+
|
| 91 |
+
# Wave-K runtime surfaces; each endpoint is GET-only and safe to inspect.
|
| 92 |
+
_surface("kc_trackfusion", "Track-Fusion (JPDA/MHT)", "Associate multiple targets and report swarm-intent and ROE advice.", "/api/killinchu/v1/trackfusion/associate", "SIMULATED", "modeled", "Simulated sensors; recommendation only; human-on-loop.", "Frontier multi-target reasoning with a clear simulation label.", visibility="runtime"),
|
| 93 |
+
_surface("kc_onebit", "1-bit / Ternary Energy", "Estimate low-precision inference energy tradeoffs.", "/api/killinchu/v1/onebit/estimate", "MODELED", "modeled", "Measured context and modeled estimates must remain separate.", "Connects edge economics to model architecture choices.", visibility="runtime"),
|
| 94 |
+
_surface("kc_ccattest", "Confidential-Compute Attest", "Compare a measurement chain against a golden reference.", "/api/killinchu/v1/cc-attest/verify", "MODELED", "modeled", "Seeded model; not a live hardware attestation unless explicitly reported.", "Shows how sovereign workloads can inherit hardware-rooted evidence.", visibility="runtime"),
|
| 95 |
+
_surface("kc_sement", "Semantic-Entropy Gate", "Estimate semantic uncertainty as an advisory trust input.", "/api/killinchu/v1/sement/estimate", "MODELED", "modeled", "Advisory only; not a proof and never a green authorization.", "Adds uncertainty awareness to the governed inference story.", visibility="runtime"),
|
| 96 |
+
_surface("kc_ttc", "Test-Time-Compute Allocator", "Allocate reasoning budget against expected gain and joules.", "/api/killinchu/v1/testtime/scaling", "MODELED", "modeled", "Budget recommendation only; does not change compute allocation.", "Makes reasoning cost a governed product variable.", visibility="runtime"),
|
| 97 |
+
_surface("kc_specdec", "Speculative-Decode Receipt", "Model accepted-token speedup and energy receipts.", "/api/killinchu/v1/specdecode/simulate", "MODELED", "modeled", "Simulation only; losslessness is scoped to the modelled acceptance path.", "Pairs inference acceleration with auditability.", visibility="runtime"),
|
| 98 |
+
_surface("kc_worldmodel", "Governed World-Model", "Run a bounded latent rollout with consistency diagnostics.", "/api/killinchu/v1/worldmodel/predict", "MODELED", "modeled", "Advisory prediction; not a physical-world authority.", "Introduces governed predictive planning as a future product layer.", visibility="runtime"),
|
| 99 |
+
_surface("kc_episodic", "Episodic Memory Recall", "Score recall over a deterministic seeded memory graph.", "/api/killinchu/v1/episodic/recall", "MODELED", "modeled", "Seeded graph; not a live user-memory store.", "Makes agent memory inspectable and replayable.", visibility="runtime"),
|
| 100 |
+
_surface("kc_qec", "Topological QEC / Surface-Code", "Model below-threshold suppression and receipt survival.", "/api/killinchu/v1/qec/surface-code", "MODELED", "modeled", "Classical simulation and analogy; not a live quantum processor.", "Connects resilience research to the evidence ledger." , visibility="runtime"),
|
| 101 |
+
_surface("kc_energy", "Sovereign-Compute Energy", "Report local GPU energy when reachable and degrade honestly otherwise.", "/api/killinchu/v1/energy/sovereign", "LIVE_OR_ROADMAP", "mixed", "No live claim unless the sovereign metrics probe answers.", "Turns sovereign-compute economics into a measurable operating metric.", visibility="runtime"),
|
| 102 |
+
|
| 103 |
+
# Server-injected navigation links. They are real pages, not /elite view keys.
|
| 104 |
+
_surface("route_restraint", "Restraint", "Open the governed-frugality surface on the sibling application.", "https://szlholdings-a11oy.hf.space/restraint", "ROUTE", "route", "External sibling route; availability is not auto-probed by Killinchu.", "Connects mission value to governed resource use.", kind="route", safe_probe=False),
|
| 105 |
+
_surface("route_mbse", "MBSE Water-Tank Co-Sim", "Open the governed water-tank co-simulation.", "/mbse", "ROUTE", "route", "Model-based engineering surface; no physical system is controlled.", "Shows requirements-to-simulation traceability.", kind="route", safe_probe=False),
|
| 106 |
+
_surface("route_mbse_6dof", "MBSE 6DOF FMU Twin", "Open the modeled six-degree-of-freedom digital twin.", "/mbse-6dof", "ROUTE", "route", "Modeled twin, not live flight control.", "Demonstrates a path from software assurance to physical-system models.", kind="route", safe_probe=False),
|
| 107 |
+
_surface("route_mbse_pipeline", "Requirement to Lean to FMU to Receipt", "Open the end-to-end engineering evidence pipeline.", "/mbse-pipeline", "ROUTE", "route", "Pipeline evidence does not constitute certification.", "A concise diligence path from requirement to verifiable artifact.", kind="route", safe_probe=False),
|
| 108 |
+
_surface("route_waqay", "WAQAY Vector Index", "Open the governed vector-index surface.", "/waqay", "ROUTE", "route", "Retrieval remains evidence-scoped; signatures do not attest semantic truth.", "Connects governed retrieval to the broader estate.", kind="route", safe_probe=False),
|
| 109 |
+
_surface("route_yupay", "YUPAY Multi-Model Audit", "Open the governed multi-model audit surface.", "/yupay", "ROUTE", "route", "Model agreement is evidence, not ground truth.", "Shows cross-model accountability and auditability.", kind="route", safe_probe=False),
|
| 110 |
+
_surface("route_spaces", "Spaces", "Open the estate Space directory.", "/spaces", "ROUTE", "route", "Directory only; each linked surface retains its own evidence state.", "Provides a coherent ecosystem entry point.", kind="route", safe_probe=False),
|
| 111 |
+
)
|
| 112 |
+
|
| 113 |
+
|
| 114 |
+
def build_manifest(ns: str = "killinchu") -> dict[str, Any]:
|
| 115 |
+
surfaces = []
|
| 116 |
+
for item in EXPERIENCE_SURFACES:
|
| 117 |
+
row = dict(item)
|
| 118 |
+
row["source"] = dict(item["source"])
|
| 119 |
+
row["source"]["endpoint"] = row["source"]["endpoint"].replace("{ns}", ns)
|
| 120 |
+
row["route"] = row["route"].replace("{ns}", ns)
|
| 121 |
+
surfaces.append(row)
|
| 122 |
+
visibility = Counter(row["visibility"] for row in surfaces)
|
| 123 |
+
states = Counter(row["data_state"] for row in surfaces)
|
| 124 |
+
return {
|
| 125 |
+
"schema": "szl.experience-manifest/v1",
|
| 126 |
+
"space": ns,
|
| 127 |
+
"generated_at": datetime.now(timezone.utc).isoformat(),
|
| 128 |
+
"surface_count": len(surfaces),
|
| 129 |
+
"summary": {
|
| 130 |
+
"by_visibility": dict(sorted(visibility.items())),
|
| 131 |
+
"by_data_state": dict(sorted(states.items())),
|
| 132 |
+
"safe_get_probes": sum(1 for row in surfaces if row["source"]["safe_probe"]),
|
| 133 |
+
},
|
| 134 |
+
"honesty": "Declared states are contracts, not reachability claims. The UI probes only allow-listed GET endpoints and reports HTTP/freshness separately.",
|
| 135 |
+
"surfaces": surfaces,
|
| 136 |
+
}
|
| 137 |
+
|
| 138 |
+
|
| 139 |
+
def register(app: "FastAPI", ns: str = "killinchu") -> dict[str, Any]:
|
| 140 |
+
path = f"/api/{ns}/v1/experience/manifest"
|
| 141 |
+
if any(getattr(route, "path", None) == path for route in app.routes):
|
| 142 |
+
return {"module": __name__, "registered": [], "surface_count": len(EXPERIENCE_SURFACES)}
|
| 143 |
+
|
| 144 |
+
@app.get(path, include_in_schema=False)
|
| 145 |
+
async def experience_manifest():
|
| 146 |
+
from fastapi.responses import JSONResponse
|
| 147 |
+
|
| 148 |
+
return JSONResponse(build_manifest(ns))
|
| 149 |
+
|
| 150 |
+
return {"module": __name__, "registered": [f"GET {path}"], "surface_count": len(EXPERIENCE_SURFACES)}
|
| 151 |
+
|
| 152 |
+
|
| 153 |
+
EXPERIENCE_LAYER_HTML = r"""<!-- __KILLINCHU_EXPERIENCE_LAYER_V1__ -->
|
| 154 |
+
<style>
|
| 155 |
+
#szl-data-passport{display:grid;grid-template-columns:minmax(0,1.35fr) repeat(3,minmax(125px,1fr));gap:1px;margin:.65rem 0 .9rem;border:1px solid rgba(201,183,135,.28);border-radius:10px;overflow:hidden;background:#24282f}
|
| 156 |
+
.szl-passport-cell{min-width:0;background:#101318;padding:.62rem .72rem}.szl-passport-k{display:block;color:#8f9aa8;font:600 9px/1.2 var(--mono,monospace);letter-spacing:.11em;text-transform:uppercase;margin-bottom:.3rem}.szl-passport-v{display:block;color:#d9dee5;font:500 11px/1.45 var(--mono,monospace);overflow-wrap:anywhere}.szl-passport-v strong{color:#7fd6c7}.szl-passport-boundary{grid-column:1/-1;border-top:1px solid #24282f}.szl-passport-boundary .szl-passport-v{font-family:var(--sans,system-ui,sans-serif);font-size:12px;color:#b8c0ca}.szl-passport-live{width:7px;height:7px;border-radius:50%;display:inline-block;margin-right:6px;background:#c9a05f;vertical-align:1px}.szl-passport-live[data-ok="true"]{background:#5fb3a3}.szl-passport-live[data-ok="false"]{background:#b06a5a}
|
| 157 |
+
@media(max-width:880px){#szl-data-passport{grid-template-columns:1fr 1fr}.szl-passport-boundary{grid-column:1/-1}}
|
| 158 |
+
@media(max-width:520px){#szl-data-passport{grid-template-columns:1fr}.szl-passport-boundary{grid-column:auto}}
|
| 159 |
+
@media(prefers-reduced-motion:reduce){#szl-data-passport *{scroll-behavior:auto!important;transition:none!important}}
|
| 160 |
+
</style>
|
| 161 |
+
<script>
|
| 162 |
+
(function(){
|
| 163 |
+
'use strict';
|
| 164 |
+
if(window.__KC_EXPERIENCE_LAYER__) return; window.__KC_EXPERIENCE_LAYER__=1;
|
| 165 |
+
var NS='__NS__', manifest=null, manifestPromise=null, probeToken=0;
|
| 166 |
+
function esc(s){return String(s==null?'':s).replace(/[&<>\"]/g,function(c){return {'&':'&','<':'<','>':'>','\"':'"'}[c];});}
|
| 167 |
+
function loadManifest(){
|
| 168 |
+
if(manifest) return Promise.resolve(manifest);
|
| 169 |
+
if(!manifestPromise) manifestPromise=fetch('/api/'+NS+'/v1/experience/manifest',{headers:{accept:'application/json'},cache:'no-store'}).then(function(r){if(!r.ok)throw new Error('HTTP '+r.status);return r.json();}).then(function(d){manifest=d;return d;});
|
| 170 |
+
return manifestPromise;
|
| 171 |
+
}
|
| 172 |
+
function rowFor(key){var xs=(manifest&&manifest.surfaces)||[];for(var i=0;i<xs.length;i++)if(xs[i].id===key)return xs[i];return null;}
|
| 173 |
+
function stamp(d){return d&&(d.observed_at||d.fetched_at||d.as_of||d.ts||d.timestamp||d.generated_at)||null;}
|
| 174 |
+
function sourceLabel(d){return d&&(d.data_label||d.status_label||d.mode||d.label||d.status)||null;}
|
| 175 |
+
function cell(k,v,cls){return '<div class="szl-passport-cell '+(cls||'')+'"><span class="szl-passport-k">'+esc(k)+'</span><span class="szl-passport-v">'+v+'</span></div>';}
|
| 176 |
+
function mount(key){
|
| 177 |
+
var token=++probeToken;
|
| 178 |
+
loadManifest().then(function(){
|
| 179 |
+
if(token!==probeToken)return; var row=rowFor(key); if(!row)return;
|
| 180 |
+
var old=document.getElementById('szl-data-passport'); if(old)old.remove();
|
| 181 |
+
var head=document.querySelector('#content .view-head'); if(!head)return;
|
| 182 |
+
var box=document.createElement('section'); box.id='szl-data-passport'; box.setAttribute('aria-label','Data and evidence passport'); box.setAttribute('role','region');
|
| 183 |
+
box.innerHTML=cell('Source',esc(row.source.method+' '+row.source.endpoint))+cell('Declared data',esc(row.data_state))+cell('Evidence',esc(row.evidence_state))+cell('Reachability','<span class="szl-passport-live"></span><span id="szl-passport-reach">not probed</span>')+cell('Safety boundary',esc(row.operational_boundary)+' <strong>Why it matters:</strong> '+esc(row.investor_value),'szl-passport-boundary');
|
| 184 |
+
head.insertAdjacentElement('afterend',box);
|
| 185 |
+
if(!row.source.safe_probe){document.getElementById('szl-passport-reach').textContent='on demand / no automatic action';return;}
|
| 186 |
+
var ctrl=new AbortController(), timer=setTimeout(function(){ctrl.abort();},4500);
|
| 187 |
+
fetch(row.source.endpoint,{headers:{accept:'application/json'},cache:'no-store',signal:ctrl.signal}).then(function(r){
|
| 188 |
+
var ct=r.headers.get('content-type')||''; if(!r.ok||ct.indexOf('json')<0)throw new Error('HTTP '+r.status);
|
| 189 |
+
return r.json().then(function(d){return {status:r.status,data:d};});
|
| 190 |
+
}).then(function(res){
|
| 191 |
+
clearTimeout(timer); if(token!==probeToken)return; var target=document.getElementById('szl-passport-reach'); if(!target)return;
|
| 192 |
+
var dot=target.previousElementSibling;if(dot)dot.setAttribute('data-ok','true'); var label=sourceLabel(res.data), seen=stamp(res.data);
|
| 193 |
+
target.textContent='HTTP '+res.status+(label?' · '+label:'')+(seen?' · as of '+seen:' · freshness not supplied');
|
| 194 |
+
}).catch(function(err){
|
| 195 |
+
clearTimeout(timer); if(token!==probeToken)return; var target=document.getElementById('szl-passport-reach'); if(!target)return;
|
| 196 |
+
var dot=target.previousElementSibling;if(dot)dot.setAttribute('data-ok','false');target.textContent=(err&&err.name==='AbortError')?'timeout / honest unknown':'unavailable / '+String(err&&err.message||err);
|
| 197 |
+
});
|
| 198 |
+
}).catch(function(){});
|
| 199 |
+
}
|
| 200 |
+
function activateNav(){
|
| 201 |
+
document.querySelectorAll('.nav-item').forEach(function(node){
|
| 202 |
+
// Preserve native anchors (including cross-surface links) as links. Only
|
| 203 |
+
// div-based in-console items need the button keyboard contract.
|
| 204 |
+
var nativeLink=node.tagName && node.tagName.toLowerCase()==='a';
|
| 205 |
+
if(!nativeLink){
|
| 206 |
+
if(!node.hasAttribute('role'))node.setAttribute('role','button');
|
| 207 |
+
if(!node.hasAttribute('tabindex'))node.setAttribute('tabindex','0');
|
| 208 |
+
if(!node.dataset.kcKeyboard){node.dataset.kcKeyboard='1';node.addEventListener('keydown',function(e){if(e.key==='Enter'||e.key===' '){e.preventDefault();node.click();}});}
|
| 209 |
+
}
|
| 210 |
+
if(node.classList.contains('active'))node.setAttribute('aria-current','page');else node.removeAttribute('aria-current');
|
| 211 |
+
});
|
| 212 |
+
}
|
| 213 |
+
function wrapGo(){
|
| 214 |
+
if(typeof window.go!=='function'||window.go.__kcExperience)return false;
|
| 215 |
+
var original=window.go; window.go=function(view){var out=original.apply(this,arguments);activateNav();mount(view);return out;}; window.go.__kcExperience=true; return true;
|
| 216 |
+
}
|
| 217 |
+
function boot(){
|
| 218 |
+
activateNav(); wrapGo(); loadManifest().then(function(){mount((location.hash||'#tracks').slice(1));}).catch(function(){});
|
| 219 |
+
var attempts=0, iv=setInterval(function(){activateNav();if(wrapGo()||++attempts>40)clearInterval(iv);},100);
|
| 220 |
+
try{new MutationObserver(function(){activateNav();}).observe(document.querySelector('.side')||document.body,{childList:true,subtree:true});}catch(e){}
|
| 221 |
+
}
|
| 222 |
+
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',boot);else boot();
|
| 223 |
+
})();
|
| 224 |
+
</script>"""
|
| 225 |
+
|
| 226 |
+
|
| 227 |
+
__all__ = ["EXPERIENCE_SURFACES", "EXPERIENCE_LAYER_HTML", "build_manifest", "register"]
|
serve.py
CHANGED
|
@@ -3379,6 +3379,17 @@ except Exception as _mosaic_e:
|
|
| 3379 |
# Doctrine v11 LOCKED 749/14/163 @ c7c0ba17 · Λ = Conjecture 1 · SLSA L1 honest.
|
| 3380 |
# Signed-off-by: Stephen P. Lutar Jr. <stephenlutar2@gmail.com>
|
| 3381 |
# ===========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3382 |
try:
|
| 3383 |
import killinchu_elite_console as _elite
|
| 3384 |
_elite_status = _elite.register(app, ns="killinchu", emit_receipt=_emit_receipt)
|
|
|
|
| 3379 |
# Doctrine v11 LOCKED 749/14/163 @ c7c0ba17 · Λ = Conjecture 1 · SLSA L1 honest.
|
| 3380 |
# Signed-off-by: Stephen P. Lutar Jr. <stephenlutar2@gmail.com>
|
| 3381 |
# ===========================================================================
|
| 3382 |
+
try:
|
| 3383 |
+
import killinchu_experience as _experience
|
| 3384 |
+
_experience_status = _experience.register(app, ns="killinchu")
|
| 3385 |
+
print(
|
| 3386 |
+
f"[killinchu] Experience manifest registered: "
|
| 3387 |
+
f"{_experience_status['surface_count']} discoverable surfaces",
|
| 3388 |
+
file=sys.stderr,
|
| 3389 |
+
)
|
| 3390 |
+
except Exception as _experience_e:
|
| 3391 |
+
print(f"[killinchu] Experience manifest NOT registered: {_experience_e!r}", file=sys.stderr)
|
| 3392 |
+
|
| 3393 |
try:
|
| 3394 |
import killinchu_elite_console as _elite
|
| 3395 |
_elite_status = _elite.register(app, ns="killinchu", emit_receipt=_emit_receipt)
|
tests/test_killinchu_experience_contract.py
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import unittest
|
| 2 |
+
|
| 3 |
+
import killinchu_experience as experience
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
class ExperienceManifestTests(unittest.TestCase):
|
| 7 |
+
def setUp(self):
|
| 8 |
+
self.manifest = experience.build_manifest("killinchu")
|
| 9 |
+
self.surfaces = self.manifest["surfaces"]
|
| 10 |
+
|
| 11 |
+
def test_manifest_has_all_discoverable_surfaces(self):
|
| 12 |
+
self.assertEqual(48, self.manifest["surface_count"])
|
| 13 |
+
self.assertEqual(48, len(self.surfaces))
|
| 14 |
+
ids = [row["id"] for row in self.surfaces]
|
| 15 |
+
self.assertEqual(len(ids), len(set(ids)))
|
| 16 |
+
self.assertTrue({"hero_interdiction", "mosaic", "kc_energy", "route_spaces"} <= set(ids))
|
| 17 |
+
|
| 18 |
+
def test_every_surface_has_an_honest_contract(self):
|
| 19 |
+
required = {
|
| 20 |
+
"id",
|
| 21 |
+
"label",
|
| 22 |
+
"route",
|
| 23 |
+
"kind",
|
| 24 |
+
"visibility",
|
| 25 |
+
"purpose",
|
| 26 |
+
"source",
|
| 27 |
+
"data_state",
|
| 28 |
+
"evidence_state",
|
| 29 |
+
"operational_boundary",
|
| 30 |
+
"investor_value",
|
| 31 |
+
}
|
| 32 |
+
for row in self.surfaces:
|
| 33 |
+
self.assertFalse(required - row.keys(), row["id"])
|
| 34 |
+
self.assertTrue(row["operational_boundary"].strip(), row["id"])
|
| 35 |
+
self.assertTrue(row["investor_value"].strip(), row["id"])
|
| 36 |
+
|
| 37 |
+
def test_automatic_probes_are_get_only_api_reads(self):
|
| 38 |
+
for row in self.surfaces:
|
| 39 |
+
source = row["source"]
|
| 40 |
+
if source["safe_probe"]:
|
| 41 |
+
self.assertEqual("GET", source["method"], row["id"])
|
| 42 |
+
self.assertTrue(source["endpoint"].startswith("/api/"), row["id"])
|
| 43 |
+
decoder = next(row for row in self.surfaces if row["id"] == "decoders")
|
| 44 |
+
self.assertEqual("POST", decoder["source"]["method"])
|
| 45 |
+
self.assertFalse(decoder["source"]["safe_probe"])
|
| 46 |
+
|
| 47 |
+
def test_visibility_counts_match_the_audit(self):
|
| 48 |
+
counts = self.manifest["summary"]["by_visibility"]
|
| 49 |
+
self.assertEqual(6, counts["hidden_r_and_d"])
|
| 50 |
+
self.assertEqual(6, counts["retired_from_nav"])
|
| 51 |
+
self.assertEqual(11, counts["runtime"])
|
| 52 |
+
self.assertEqual(25, counts["primary"])
|
| 53 |
+
|
| 54 |
+
def test_ui_layer_is_accessible_and_read_only(self):
|
| 55 |
+
html = experience.EXPERIENCE_LAYER_HTML
|
| 56 |
+
self.assertIn("__KILLINCHU_EXPERIENCE_LAYER_V1__", html)
|
| 57 |
+
self.assertIn("aria-label','Data and evidence passport", html)
|
| 58 |
+
self.assertIn("setAttribute('role','button')", html)
|
| 59 |
+
self.assertIn("var nativeLink=node.tagName", html)
|
| 60 |
+
self.assertIn("if(!nativeLink)", html)
|
| 61 |
+
self.assertIn("e.key==='Enter'||e.key===' '", html)
|
| 62 |
+
self.assertIn("aria-current", html)
|
| 63 |
+
self.assertNotIn("method:'POST'", html)
|
| 64 |
+
self.assertIn("row.source.safe_probe", html)
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
if __name__ == "__main__":
|
| 68 |
+
unittest.main()
|