<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: FateShow</title>
    <description>The latest articles on DEV Community by FateShow (@dream_wang_76b69082e3f0db).</description>
    <link>https://dev.to/dream_wang_76b69082e3f0db</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4188360%2F70eadf4e-492a-44bc-9809-6b6c1d5b1349.png</url>
      <title>DEV Community: FateShow</title>
      <link>https://dev.to/dream_wang_76b69082e3f0db</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dream_wang_76b69082e3f0db"/>
    <language>en</language>
    <item>
      <title>Why FateShow Calculates the Chart Before Asking a Model to Explain It</title>
      <dc:creator>FateShow</dc:creator>
      <pubDate>Fri, 16 Oct 2026 08:41:41 +0000</pubDate>
      <link>https://dev.to/dream_wang_76b69082e3f0db/why-fateshow-calculates-the-chart-before-asking-a-model-to-explain-it-1f9d</link>
      <guid>https://dev.to/dream_wang_76b69082e3f0db/why-fateshow-calculates-the-chart-before-asking-a-model-to-explain-it-1f9d</guid>
      <description>&lt;p&gt;Most AI astrology products start with a prompt. Birth data, a place, and a question go to the model, which is asked to cast the chart, judge it, and write the report in one pass.&lt;/p&gt;

&lt;p&gt;FateShow runs the other way. A deterministic engine casts the chart, the result is reduced to structured evidence, and the model only explains that evidence. If the explanation does not match the chart, the page returns the rule reading already computed from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What prompt-first generation gets wrong
&lt;/h2&gt;

&lt;p&gt;Language models should not calculate calendars or planetary positions. The same input can yield different pillars, houses, or line values. Fluent prose hides the miss. Regenerating the report can change the claims underneath it.&lt;/p&gt;

&lt;p&gt;One case showed up in our own pipeline. On the English report path the chart carried four palaces, and the model sometimes returned interpretations for only two. Asking it to fill the gap would have meant invented stars for the palaces it skipped. The missing slots are filled from the rule reading at the same index. The palace set stays as calculated. No star is added.&lt;/p&gt;

&lt;p&gt;A second class of error sits entirely in the calculation. Converting a lunar date requires an explicit leap-month flag. Drop it, and a leap fifth month is treated as an ordinary fifth month. The month pillar is wrong, and every pillar after it follows. A model should not be asked to smooth that over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculate first
&lt;/h2&gt;

&lt;p&gt;A Zi Wei reading runs in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Validate birth data, calendar, time zone, true-solar-time switch, day boundary, and the question.&lt;/li&gt;
&lt;li&gt;Run the deterministic chart engine.&lt;/li&gt;
&lt;li&gt;Reduce the chart to evidence: palaces, major stars, auxiliary stars, transformations, and rule verdicts that already have ids.&lt;/li&gt;
&lt;li&gt;Give the model only that packet. The prompt states how many evidence rows exist, requires palace names to be copied as given, and limits timing claims to rules already present.&lt;/li&gt;
&lt;li&gt;Validate the JSON. Drop palaces that are not in the input. Drop facts that are not in that palace’s star list. Drop rule ids the rule layer did not emit. Backfill missing palaces from the rule reading at the original index. Reject the report if the summary, the evidence, or the actions are empty.&lt;/li&gt;
&lt;li&gt;On rejection, timeout, or provider error, return the rule reading and release the reserved credit. The same input hits a thirty-minute cache, so a retry does not silently replace the wording. Simplified and Traditional Chinese never share a cache key.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Liu Yao freezes the facts earlier. The server stores the six line values when the chart is cast. Reloading that id does not recast. Interpretation receives the finished Najia chart. The model must cite at least two strings that appear in the chart text. If the citations miss, the call times out, or no key is configured, the page still shows the rule reading.&lt;/p&gt;

&lt;p&gt;This is the production shape, shortened:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;readChart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createChart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;          &lt;span class="c1"&gt;// deterministic engine&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;packet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toEvidence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chart&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                &lt;span class="c1"&gt;// only citable facts&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;explain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;packet&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;packet&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;          &lt;span class="c1"&gt;// palaces, stars, rule ids must match&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ai&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;report&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;ruleReport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;packet&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rules&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BaZi is assembled the same way. A shared birth model restores the civil time, applies true solar time when that switch is on, builds the four pillars, then runs the analysis layer on that same chart.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the split is for
&lt;/h2&gt;

&lt;p&gt;Chart facts are reproducible. The year boundary at Start of Spring, the day boundary at 23:00 or 00:00, the two-hour branches, and the true-solar-time switch decide the pillars. Those switches stay on the chart. When two charts disagree, compare the switches before comparing the prose.&lt;/p&gt;

&lt;p&gt;Debugging has a seam. A wrong star is an engine or calendar bug. An empty sentence, a palace that does not match, or a rule id that was never emitted is an interpretation bug. Retrying the model does not move a pillar, a palace, or a line.&lt;/p&gt;

&lt;p&gt;Tests split the same way. Chart tests assert fields for a fixed input. Interpretation tests use a fixture packet and check that extra stars are stripped, missing palaces are backfilled, and an empty summary is rejected.&lt;/p&gt;

&lt;p&gt;The model is replaceable. DeepSeek or another provider receives the same evidence. If the provider times out, the user still sees the rule reading of this chart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Several systems, no shared calculator
&lt;/h2&gt;

&lt;p&gt;The site casts BaZi, Zi Wei Dou Shu, Western astrology, Vedic astrology, Human Design, numerology, Liu Yao, Plum Blossom, Qi Men, and Lenormand. They share input validation, time-zone resolution, and a report contract of “evidence in, prose out.” They do not share a calculation model.&lt;/p&gt;

&lt;p&gt;The shared layer is the birth record, historical time zones and daylight saving, solar terms, stems and branches, and true solar time. BaZi, Zi Wei, and Western astrology sit side by side. A domain does not call another domain. When a combined reading is needed, a layer above joins two finished charts.&lt;/p&gt;

&lt;p&gt;What stays specific:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;How time is used&lt;/th&gt;
&lt;th&gt;What the engine emits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BaZi&lt;/td&gt;
&lt;td&gt;Start of Spring, solar-term months, day boundary, optional true solar time&lt;/td&gt;
&lt;td&gt;Pillars, ten gods, hidden stems, strength and pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zi Wei&lt;/td&gt;
&lt;td&gt;Year boundary and leap month set the Life Palace; true solar time can move a palace&lt;/td&gt;
&lt;td&gt;Twelve palaces, stars, transformations, decade spans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Western / Vedic / Human Design&lt;/td&gt;
&lt;td&gt;Civil time restored to UT; no true solar time&lt;/td&gt;
&lt;td&gt;Planets and houses, sidereal positions and dasha, or gates and type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Numerology&lt;/td&gt;
&lt;td&gt;Gregorian date only&lt;/td&gt;
&lt;td&gt;Number layers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Liu Yao / Plum Blossom / Qi Men&lt;/td&gt;
&lt;td&gt;The question clock, frozen at submit; not a birth time&lt;/td&gt;
&lt;td&gt;Line values and Najia, body and use, or duty star and duty door&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Numerology should not require a birthplace. Western charts should not inherit a 23:00 Chinese day boundary. Liu Yao’s month and day come from the moment of the question. Folding all of that into one generic chart JSON leaves fields that mean nothing in some systems, and the model fills them with vocabulary from another system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three changes that came from failures
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The engine and the analysis layer did not share a key language.&lt;/strong&gt; The BaZi engine emitted English keys. The analysis layer read Chinese keys. Both sides looked implemented, and every analysis field was empty. The fix is one shape conversion in the assembly layer, so both layers read the same chart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Chinese character budget was applied to English.&lt;/strong&gt; The summary cap was about 500 characters. One hundred English words are closer to 600 characters, so sentences were cut mid-phrase. The cap was raised enough to hold a full English sentence, and the Chinese and English length rules are written separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Palace names were matched exactly.&lt;/strong&gt; The input said &lt;code&gt;soul&lt;/code&gt;; the model returned &lt;code&gt;Soul&lt;/code&gt; or another translation, and the whole evidence row disappeared. Matching now ignores case and maps translations back through the glossary. Backfill uses the original index, so the facts are not paired by name a second time.&lt;/p&gt;

&lt;p&gt;The Liu Yao demo has a separate constraint. The Najia library’s license does not belong in the main site bundle, and an in-memory cast disappears when the process restarts. The site keeps the same rule — freeze the lines, then explain them — and integrates that step on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  What transfers
&lt;/h2&gt;

&lt;p&gt;When generated prose has to stay tied to a source, finish the source first, store it, and hand the model only the evidence it is allowed to cite. When validation fails, return that source. Do not ask the model to patch the hole.&lt;/p&gt;

&lt;p&gt;The same constraint shows up in finance, legal research, health information, and education. The model’s job is to say what the facts already are. Calculation, retrieval, and rules are what make the facts hold.&lt;/p&gt;

&lt;p&gt;FateShow uses that order for natal charts, synastry, and divination: &lt;a href="https://www.fateshow.site/en/" rel="noopener noreferrer"&gt;fateshow.site&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
