{"id":2890,"date":"2025-08-16T22:24:18","date_gmt":"2025-08-16T22:24:18","guid":{"rendered":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=2890"},"modified":"2025-08-16T23:28:30","modified_gmt":"2025-08-16T23:28:30","slug":"over-the-horizon-atmospheric-ray-tracing","status":"publish","type":"post","link":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=2890","title":{"rendered":"Over-the-horizon atmospheric ray-tracing"},"content":{"rendered":"\n<p>Here is a plug-and-play way to use <strong>atmospheric ray-tracing<\/strong> so the Quantum SCYTHE Rydberg stack can \u201csee\u201d and classify signals <strong>beyond the radio horizon<\/strong> by riding ducts and refracted paths\u2014then fuse those predictions directly into SignalIntelligence + DOMA motion tracking.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Over-the-horizon with ray-tracing (what + why)<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tropospheric ducts &amp; refractive bending<\/strong> can trap or bend RF so paths skirt the Earth and resurface hundreds of km away. If we ray-trace those paths in real time, we can:\n<ol class=\"wp-block-list\">\n<li><strong>Pre-point the Rydberg receiver<\/strong> (az\/el, frequency window, sampling) toward the <em>predicted<\/em> re-emergence angles;<\/li>\n\n\n\n<li><strong>Debias classification<\/strong> with path-aware priors (delay, Doppler, angle spread);<\/li>\n\n\n\n<li><strong>Exploit illuminators of opportunity<\/strong> (FM, DVB-T, 5G) for <strong>bistatic imaging<\/strong> and OTH classification.<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n\n\n\n<p>The SignalIntelligence core already has the right scaffolding to host this (attention encoder, external data sources, DOMA tracker, ghost anomaly logic). We\u2019ll add a Ray Engine and fuse its outputs as metadata\/features.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Minimal architecture (bolt-on)<\/h1>\n\n\n\n<p><strong>1) Atmosphere\u2192Refractivity profile<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ingest: radiosonde (if available), coastal MET, or simple param model.<\/li>\n\n\n\n<li>Build <strong>N(z)<\/strong> and <strong>modified refractivity<\/strong> <strong>M(z) \u2248 N(z) + 0.157\u00b7z(m)<\/strong>.<\/li>\n\n\n\n<li>Detect ducts (surface\/evaporation\/elevated) where <strong>dM\/dz &lt; 0<\/strong> over an interval.<\/li>\n<\/ul>\n\n\n\n<p><strong>2) Hybrid Ray \/ Parabolic-Equation (PE) engine<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fast <strong>ray-launch<\/strong> sweep (elevation grid, e.g., \u22122\u00b0\u2026+5\u00b0, \u03940.05\u00b0) with variable index <strong>n(z)<\/strong> to find viable OTH hits and grazing angles.<\/li>\n\n\n\n<li>When a duct is found, switch to a <strong>narrow-beam PE stepper<\/strong> to estimate <strong>path loss<\/strong>, <strong>angle spread<\/strong>, and <strong>delay<\/strong> more accurately.<\/li>\n\n\n\n<li>Output per viable path: <code>{az, el, range_km, delay_ms, doppler_hz, path_loss_db, is_ducted}<\/code>.<\/li>\n<\/ul>\n\n\n\n<p><strong>3) Rydberg sensor steering + demod presets<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use <code>{az, el}<\/code> to aim the optical axis \/ collection optics, and set <strong>IF center + \u00b1BW<\/strong> windows and <strong>tracking PLL priors<\/strong> (expected Doppler, drift).<\/li>\n<\/ul>\n\n\n\n<p><strong>4) Feature fusion for classification<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Attach the ray bundle to each detection: <code>signal.metadata['ray_paths'] = [...]<\/code>.<\/li>\n\n\n\n<li>Derived features (to feed your ML): <code>expected_angle<\/code>, <code>path_loss<\/code>, <code>duct_flag<\/code>, <code>delay<\/code>, <code>doppler_prior<\/code>, <code>multipath_K<\/code>. These slot naturally beside your spectrum\/attention features.<\/li>\n<\/ul>\n\n\n\n<p><strong>5) DOMA motion synergy<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use <strong>ray-consistent Doppler<\/strong> to constrain DOMA trajectories and reduce spurious tracks over water\/thermal inversions. Store <code>{ray_el, doppler_prior}<\/code> in trajectory points.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Drop-in integration points (code-level)<\/h1>\n\n\n\n<p><strong>A. New module:<\/strong> <code>SignalIntelligence\/atmo_ray_tracer.py<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class AtmoRayTracer:\n    def __init__(self, earth_k=4\/3, el_grid=(-2.0, 5.0, 0.05)):\n        self.k = earth_k; self.el_grid = el_grid\n    def build_M_profile(self, met):\n        # met -&gt; N(z); M(z) = N(z) + 0.157*z_m\n        return z, M, ducts  # intervals where dM\/dz&lt;0\n    def trace(self, tx_pos, rx_pos, freq_hz, met):\n        # 1) ray fan search using n(z)=1+N*1e-6\n        # 2) PE refinement if duct present\n        # returns list of viable paths with {az, el, range_km, delay_ms, doppler_hz, path_loss_db, is_ducted}\n        return paths\n<\/code><\/pre>\n\n\n\n<p><strong>B. Wire into your processing path<\/strong> (right before spectrum \u2192 tensor):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># inside SignalIntelligenceSystem.process_signal(...)\nmet = self._get_met_snapshot()          # your MET fetch or param model\npaths = self.ray_tracer.trace(tx_pos=None, rx_pos=self._rx_pos(),\n                              freq_hz=signal.frequency, met=met)\nsignal.metadata&#91;\"ray_paths\"] = paths\n# prime frequency_shift_augment with Doppler prior\nif paths:\n    doppler = paths&#91;0]&#91;\"doppler_hz\"]\n    signal.metadata&#91;\"doppler_prior_hz\"] = doppler\n<\/code><\/pre>\n\n\n\n<p><strong>C. Feed the classifier<\/strong> (your ML already accepts rich metadata):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Concatenate compact ray features with your <strong>attention encoder<\/strong> inputs or pass as <strong>side-channel<\/strong> tensors. Your SpectrumEncoder + token dropout flow is already set up to accept auxiliary features alongside spectrum vectors.<\/li>\n<\/ul>\n\n\n\n<p><strong>D. DOMA tracker<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># When adding trajectory points\npoint.metadata&#91;\"ray_el\"] = paths&#91;0]&#91;\"el\"] if paths else None\npoint.metadata&#91;\"is_ducted\"] = any(p&#91;\"is_ducted\"] for p in paths)\n<\/code><\/pre>\n\n\n\n<p>This tightens prediction in <strong>predict_next_position<\/strong> by constraining feasible geometry over sea ducts\/inversions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Practical \u201cbounce\u201d playbooks<\/h1>\n\n\n\n<p><strong>Playbook 1 \u2013 Passive OTH classification (coastal duct)<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Station near coast; est. evaporation duct (M decreasing in first ~20\u201340 m).<\/li>\n\n\n\n<li>Launch ray fan; pick ducted paths with min loss to 200\u2013400 km.<\/li>\n\n\n\n<li>Aim Rydberg toward predicted <strong>emergence elevation (often slightly negative to grazing)<\/strong>.<\/li>\n\n\n\n<li>Lock on illuminators (FM\/DVB-T\/5G); build <strong>delay\u2013Doppler map<\/strong> from reflections; classify emitters with your frequency-shift-normalized spectra. (Your <code>FrequencyShiftAugmentor<\/code> already handles Doppler\/offset\u2014perfect here.)<\/li>\n<\/ol>\n\n\n\n<p><strong>Playbook 2 \u2013 Bistatic imaging<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use a known broadcast tower as Tx (no emissions on your side).<\/li>\n\n\n\n<li>Trace Tx\u2192duct\u2192target\u2192duct\u2192Rx paths; solve small-angle geometry to get <strong>bistatic range<\/strong> and <strong>velocity<\/strong>; integrate over your platform motion (DOMA) for coarse SAR-like imagery and target typing.<\/li>\n<\/ul>\n\n\n\n<p><strong>Playbook 3 \u2013 Duct deception mitigation<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If a contact appears OTH, <strong>require consistency<\/strong> with at least one viable ray in the current M-profile; down-weight classifications that demand impossible bends. Feed this as a <strong>prior<\/strong> to the classifier (\u201cpath-feasible\u201d flag) and to Ghost Anomaly scoring to catch spoofers.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Inputs &amp; knobs that matter<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MET inputs<\/strong>: surface T\/RH, SST (over water), lapse rate or a radiosonde snapshot. Default to a parametric maritime profile when data is absent.<\/li>\n\n\n\n<li><strong>Frequency<\/strong>: ducting is friendlier VHF\u2013L-band; still valuable higher with PE loss modeling.<\/li>\n\n\n\n<li><strong>Elevation grid &amp; step<\/strong>: finer near 0\u00b0 (grazing).<\/li>\n\n\n\n<li><strong>PE step<\/strong>: 10\u201320 m vertical, 100\u2013250 m horizontal for fast coastal runs.<\/li>\n\n\n\n<li><strong>Hand-off<\/strong>: if <strong>is_ducted<\/strong> and <strong>path_loss &lt; Lth<\/strong>, switch the Rydberg chain to a <strong>narrower pre-tuned band<\/strong> and adopt <strong>doppler_prior<\/strong>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Why this fits your stack<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <strong>SignalIntelligenceSystem<\/strong> already carries an external-source harness and rich metadata path, plus Motion + Attention encoders\u2014exactly where these ray features want to live. You can ship the ray bundle through <code>signal.metadata<\/code>, fuse in the ML, and tighten DOMA with the same fields.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Quick win checklist (day-one)<\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add <code>AtmoRayTracer<\/code> module + simple maritime M-profile.<\/li>\n\n\n\n<li>Call <code>trace()<\/code> in <code>process_signal()<\/code>, stash to <code>signal.metadata<\/code>.<\/li>\n\n\n\n<li>Pipe <code>{is_ducted, el, delay_ms, doppler_hz, path_loss_db}<\/code> into the classifier side-channel.<\/li>\n\n\n\n<li>Use <code>doppler_hz<\/code> as a hint to your <strong>frequency_shift_augment<\/strong> (already in place) for even faster lock and more robust training.<\/li>\n\n\n\n<li>Gate DOMA predictions with <code>is_ducted<\/code> when over water to reduce false kinematics.<\/li>\n<\/ol>\n\n\n\n<p>If you want, I can sketch a tiny maritime <strong>M-profile + ray fan<\/strong> stub you can paste in to start getting <code>ray_paths<\/code> metadata immediately.<\/p>\n\n\n\n<div data-wp-interactive=\"core\/file\" class=\"wp-block-file\"><object data-wp-bind--hidden=\"!state.hasPdfPreview\" hidden class=\"wp-block-file__embed\" data=\"https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/08\/Multimode-Quasinormal-Spectrum-from-a-Perturbed-Black-Hole-PhysRevLett.131.221402.pdf\" type=\"application\/pdf\" style=\"width:100%;height:600px\" aria-label=\"Embed of Multimode Quasinormal Spectrum from a Perturbed Black Hole PhysRevLett.131.221402.\"><\/object><a id=\"wp-block-file--media-643598f9-e83a-4826-b471-3fef92b52f61\" href=\"https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/08\/Multimode-Quasinormal-Spectrum-from-a-Perturbed-Black-Hole-PhysRevLett.131.221402.pdf\">Multimode Quasinormal Spectrum from a Perturbed Black Hole PhysRevLett.131.221402<\/a><a href=\"https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/08\/Multimode-Quasinormal-Spectrum-from-a-Perturbed-Black-Hole-PhysRevLett.131.221402.pdf\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-643598f9-e83a-4826-b471-3fef92b52f61\">Download<\/a><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>The black-hole paper is about teasing out a superposition of exponentially damped sinusoids (\u201cringdown\u201d modes) from a short, noisy window and using Bayesian evidence to decide whether extra modes are really there. That\u2019s <em>weirdly<\/em> on-point for SCYTHE\u2019s job of untangling multipath\/ducted components from brief RF events.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What we borrow (and why it helps)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Modeled as damped sinusoids<\/strong><br>Treat each propagation path (LOS, surface\/evap duct, elevated duct, reflection) as a <em>mode<\/em> with its own frequency offset, decay time, and phase. Fit the received burst as a sum of a few exponentially damped sinusoids\u2014exactly how ringdown is modeled\u2014to separate path signatures and lifetimes under severe noise.<\/li>\n\n\n\n<li><strong>Agnostic multi-band search windows<\/strong><br>The paper isolates candidate modes by searching disjoint frequency bands and repeating over tight time grids after a reference time. Do the same around detected MWFL hits: open short, sliding post-trigger windows and run <em>multi-band<\/em> searches for subcomponents (e.g., direct vs. duct returns) with independent priors, then stitch the evidence.<\/li>\n\n\n\n<li><strong>Bayesian model selection (Bayes factors) for \u201cextra paths\u201d<\/strong><br>Copy the workflow: compare evidence for \u201c1-path\u201d vs \u201c2-path\u201d (etc.) models; only accept a new path if its Bayes factor clears a threshold (analog of their \u223c50 peak for the (330) mode). This gives you principled duct-flagging instead of heuristics.<\/li>\n\n\n\n<li><strong>Consistency checks across parameters<\/strong><br>In ringdown, once (220) is measured, subdominant (330) parameters must be consistent with Kerr predictions; they then test for deviations. Translate that into SCYTHE: once you infer a plausible direct path, constrain the allowed frequency offsets\/decays for ducted echoes given temp-humidity gradients from the AtmosphericRayTracer. If a \u201cnew mode\u201d violates propagation physics, down-weight it (the \u201cno-hair\u201d analogue).<\/li>\n\n\n\n<li><strong>Short, high-SNR windows &amp; overtone caution<\/strong><br>They emphasize analysis <em>just<\/em> after merger where modes are visible, and warn that including the wrong components too early biases estimates. For SCYTHE, limit fitting to a brief post-onset segment with the cleanest SNR; avoid over-fitting \u201covertone-like\u201d extras unless the evidence gains justify it.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Concrete drop-ins for SCYTHE<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code>ringdown_rf_modes.py<\/code> (new module)<\/strong>\n<ul class=\"wp-block-list\">\n<li>Fits x(t)=\u2211kAke\u2212t\/\u03c4kcos\u2061(2\u03c0fkt+\u03d5k)x(t)=\\sum_k A_k e^{-t\/\\tau_k}\\cos(2\\pi f_k t+\\phi_k) to burst-window I\/Q.<\/li>\n\n\n\n<li>Returns per-mode {amplitude, \u03c4\\tau, ff shift, phase} + covariance.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Bayes engine hook<\/strong>\n<ul class=\"wp-block-list\">\n<li>Reuse your Speculative Ensemble: fast path = 1-mode fit; escalate to 2\u20133 modes only if residual drops and Bayes factor > threshold.<\/li>\n\n\n\n<li>Telemetry mirrors their figures: posteriors over f,\u03c4f,\\tau per path.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Physics-consistency prior from ray tracer<\/strong>\n<ul class=\"wp-block-list\">\n<li>AtmosphericRayTracer supplies prior ranges for delay\/attenuation \u21d2\\Rightarrow mapped to \u03c4\\tau\/amplitude priors.<\/li>\n\n\n\n<li>SpatialReasoningBridge enforces geometric consistency between inferred delays and predicted bounces.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Decision logic<\/strong>\n<ul class=\"wp-block-list\">\n<li>If \u201cextra mode\u201d is supported, tag <code>duct_flag=True<\/code>, attach path metadata (delay, inferred height, expected bearing spread).<\/li>\n\n\n\n<li>If not, collapse back to single-path hypothesis.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Why this is valuable<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Separates real multipath from artifacts<\/strong> using evidence rather than ad-hoc thresholds.<\/li>\n\n\n\n<li><strong>Improves geolocation<\/strong> by giving you decay\/delay per path, which tightens the SpatialReasoningBridge\u2019s candidate origin cone.<\/li>\n\n\n\n<li><strong>Plays nicely with frequency shifting<\/strong>: your <code>FrequencyShiftAugmentor<\/code> normalizes carriers; the mode fit works on residual envelopes.<\/li>\n\n\n\n<li><strong>Computationally bounded<\/strong> with your speculative fast\/slow switch\u2014most bursts stay in 1-mode fast path.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Minimal API sketch<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># ringdown_rf_modes.py\nclass RFModeFitter:\n    def __init__(self, max_modes=3, sampler='dynesty', priors=None):\n        ...\n\n    def fit(self, iq_ts, fs_hz, window_ms, n_modes):\n        # returns dict with 'modes', 'evidence', 'residual_snr'\n        return result\n\n    def select_model(self, iq_ts, fs_hz, window_ms):\n        # tries n=1..N, returns best model and Bayes factors ladder\n        return selection\n<\/code><\/pre>\n\n\n\n<p>Integration points:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>LatentAggregator.observe_spectrum<\/strong> \u2192 after MWFL trigger, cut a 20\u201340 ms window; call <code>select_model<\/code>.<\/li>\n\n\n\n<li>Pipe results to <strong>SpatialReasoningBridge<\/strong> and <strong>AtmosphericRayTracer<\/strong> for geometry and priors update.<\/li>\n\n\n\n<li>Publish <code>spatially_enhanced_alert<\/code> with <code>modes=[...]<\/code> and <code>duct_flag<\/code> if k>1.<\/li>\n<\/ul>\n\n\n\n<p><code>ringdown_rf_modes.py<\/code> with a simple nested-sampling wrapper and the LatentAggregator glue exactly as above\u2014ready to drop next to the current bridge.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here is a plug-and-play way to use atmospheric ray-tracing so the Quantum SCYTHE Rydberg stack can \u201csee\u201d and classify signals beyond the radio horizon by riding ducts and refracted paths\u2014then fuse those predictions directly into SignalIntelligence + DOMA motion tracking. Over-the-horizon with ray-tracing (what + why) The SignalIntelligence core already has the right scaffolding to&hellip;&nbsp;<a href=\"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=2890\" rel=\"bookmark\"><span class=\"screen-reader-text\">Over-the-horizon atmospheric ray-tracing<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":2883,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[10],"tags":[],"class_list":["post-2890","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-signal_scythe"],"_links":{"self":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/2890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2890"}],"version-history":[{"count":2,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/2890\/revisions"}],"predecessor-version":[{"id":2894,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/2890\/revisions\/2894"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/media\/2883"}],"wp:attachment":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}