<?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>Designing a Birth-Time Form That Does Not Invent an Astrology Chart</title>
      <dc:creator>FateShow</dc:creator>
      <pubDate>Wed, 04 Nov 2026 13:31:20 +0000</pubDate>
      <link>https://dev.to/dream_wang_76b69082e3f0db/designing-a-birth-time-form-that-does-not-invent-an-astrology-chart-3m3</link>
      <guid>https://dev.to/dream_wang_76b69082e3f0db/designing-a-birth-time-form-that-does-not-invent-an-astrology-chart-3m3</guid>
      <description>&lt;p&gt;A birth-chart form appears to need only three inputs: date, time, and place. But those fields contain several decisions that can change the result. If the interface hides those decisions, it can produce a confident-looking chart from an incorrectly interpreted birth record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the local time and the place together
&lt;/h2&gt;

&lt;p&gt;“04:10” is a clock reading, not a universal timestamp. The same instant may appear as 04:10 in Jakarta and 05:10 in Singapore. If someone was born in Jakarta, they should be able to enter the time recorded there and select Jakarta as the birthplace. The application should handle the time-zone conversion.&lt;/p&gt;

&lt;p&gt;Asking users to convert their birth time to another city first creates an easy mistake: they may enter the converted time while still selecting their original birthplace, causing the application to convert it again.&lt;/p&gt;

&lt;p&gt;A useful data model keeps the original local date and time, the birthplace, and the resolved time zone separate. That also makes it possible to show users which assumptions were used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use the rules from the birth date
&lt;/h2&gt;

&lt;p&gt;A place's current UTC offset may not be the offset it used decades ago. Daylight saving rules have changed, sometimes more than once. A birth-chart calculator needs the time-zone rules that applied at the birthplace &lt;strong&gt;on the birth date&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The interface should also handle uncertainty honestly. If a historical local time cannot be resolved unambiguously, ask for clarification or show the uncertainty. Silently choosing an offset makes the chart look more certain than the input allows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unknown is a valid input state
&lt;/h2&gt;

&lt;p&gt;Many people do not know their birth hour. Replacing a blank field with noon or midnight may make a form easier to process, but it changes the chart.&lt;/p&gt;

&lt;p&gt;For BaZi, the year, month, and day pillars can still be shown while the hour pillar remains unknown. For Zi Wei Dou Shu, the missing hour affects the palace layout more substantially. In either case, the UI should explain what can be calculated and leave the rest unresolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make calendar boundaries visible
&lt;/h2&gt;

&lt;p&gt;Time zones are only one source of disagreement between calculators. In BaZi, the year pillar changes at Li Chun, around the beginning of February, rather than on January 1 or necessarily on Lunar New Year. The month pillar follows solar terms.&lt;/p&gt;

&lt;p&gt;For a birth close to one of these boundaries, a short note beside the result can explain which rule the calculator used. That is more useful than presenting two different charts as though one must be a software error.&lt;/p&gt;

&lt;p&gt;We apply these principles in the &lt;a href="https://www.fatequery.site/bazi/" rel="noopener noreferrer"&gt;fatequery BaZi calculator&lt;/a&gt;: the chart is calculated from the birth details first, and an AI-assisted reading explains the chart shown on screen. A follow-up question does not need to generate a new chart.&lt;/p&gt;

&lt;p&gt;The broader design lesson applies beyond astrology. When an application turns local time into a rule-based result, preserve the original input, expose consequential assumptions, and allow unknown information to remain unknown.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>datetime</category>
      <category>astrology</category>
      <category>ux</category>
    </item>
    <item>
      <title>Cast the BaZi chart in code, then let the model read it</title>
      <dc:creator>FateShow</dc:creator>
      <pubDate>Wed, 28 Oct 2026 12:04:08 +0000</pubDate>
      <link>https://dev.to/dream_wang_76b69082e3f0db/cast-the-bazi-chart-in-code-then-let-the-model-read-it-1cn4</link>
      <guid>https://dev.to/dream_wang_76b69082e3f0db/cast-the-bazi-chart-in-code-then-let-the-model-read-it-1cn4</guid>
      <description>&lt;p&gt;Ask a chat model for a BaZi chart twice. Change nothing but the wording of the question, and you often get two different sets of pillars. The model is writing a chart the way it writes a paragraph. A chart is a function of a date, a clock time, and a place. Run it again with the same arguments and the characters should match.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model never receives a blank chart
&lt;/h2&gt;

&lt;p&gt;On the &lt;a href="https://www.fatequery.site/bazi/" rel="noopener noreferrer"&gt;BaZi calculator&lt;/a&gt;, the order is fixed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take the birth date, the clock time, and the birthplace.&lt;/li&gt;
&lt;li&gt;Restore that clock time with the timezone that place was using that day, daylight saving included. Mainland China is UTC+8 in most years. In the summers of 1986 through 1991 it was UTC+9. Using today's offset for a 1988 birth moves the hour pillar.&lt;/li&gt;
&lt;li&gt;Cut that instant into four pillars. The year changes at Start of Spring, not on 1 January. The month follows the solar terms, not the Gregorian month and not the lunar month. The day pillar on this page flips at 23:00, not at midnight.&lt;/li&gt;
&lt;li&gt;Only then does the model see the page. It may explain the Day Master, the Ten Gods, and the ten-year cycle already printed. It does not rewrite a stem because the question sounded urgent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://www.fatequery.site/ziwei/" rel="noopener noreferrer"&gt;Zi Wei&lt;/a&gt; is the same contract with a different table. The same instant goes in. Stars and palaces come out. The model explains those fields. A follow-up such as "what about my job?" stays on that chart. It does not recast the hour.&lt;/p&gt;

&lt;p&gt;The page is a Next.js app. The Zi Wei placement uses &lt;a href="https://github.com/SylarLong/iztro" rel="noopener noreferrer"&gt;iztro&lt;/a&gt;. The chart object is produced before any prompt is sent.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
js
function castBazi({ date, time, place }) {
  const instant = restoreHistoricalTimezone(date, time, place); // DST included
  return fourPillars(instant); // the model may only describe this object
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <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>
