<?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>Forem: GoodRelax</title>
    <description>The latest articles on Forem by GoodRelax (@goodrelax).</description>
    <link>https://forem.com/goodrelax</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3730594%2F842c4748-f348-4366-8991-9f9de9400764.png</url>
      <title>Forem: GoodRelax</title>
      <link>https://forem.com/goodrelax</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/goodrelax"/>
    <language>en</language>
    <item>
      <title>The End of the Era Where Software Has Value</title>
      <dc:creator>GoodRelax</dc:creator>
      <pubDate>Fri, 27 Mar 2026 15:56:04 +0000</pubDate>
      <link>https://forem.com/goodrelax/the-end-of-the-era-where-software-has-value-2h4l</link>
      <guid>https://forem.com/goodrelax/the-end-of-the-era-where-software-has-value-2h4l</guid>
      <description>&lt;p&gt;Are you starting to notice?&lt;/p&gt;

&lt;p&gt;The era where software — forged through blood, sweat, and tears — loses its value is upon us.&lt;/p&gt;




&lt;p&gt;Simply put. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is value?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Something rare, and something everyone wants.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Put it in an equation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Value = Scarcity × Demand&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI has made building software no longer "scarce."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For example, &lt;a href="https://github.com/GoodRelax/gr-sw-maker" rel="noopener noreferrer"&gt;gr-sw-maker&lt;/a&gt; is achieving nearly full automation of the entire process — specs, design, implementation, testing, delivery, and operations — just from a concept description.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What loses its scarcity loses its value. The same goes for hardware designed by software.&lt;br&gt;
The value of software and hardware is quietly, but surely, fading away.&lt;/p&gt;




&lt;p&gt;So what holds value next?&lt;/p&gt;

&lt;p&gt;Let's return to the definition.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Something rare, and something everyone wants.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is simple.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Scarcity × Demand = Happiness&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Who do we make happy, and how.&lt;br&gt;
That is the only thing that truly matters from here on.&lt;/p&gt;

&lt;p&gt;When the "how" becomes free, the "why" becomes everything...&lt;/p&gt;

&lt;p&gt;So — what will you do?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I Prevented Quality Collapse in AI-Driven Dev with AI Agents and SDD</title>
      <dc:creator>GoodRelax</dc:creator>
      <pubDate>Wed, 25 Mar 2026 16:33:11 +0000</pubDate>
      <link>https://forem.com/goodrelax/how-i-prevented-quality-collapse-in-ai-driven-dev-with-ai-agents-and-sdd-4819</link>
      <guid>https://forem.com/goodrelax/how-i-prevented-quality-collapse-in-ai-driven-dev-with-ai-agents-and-sdd-4819</guid>
      <description>&lt;ul&gt;
&lt;li&gt;AI-driven development is fast (sometimes). But can you answer "is this code really OK?"&lt;/li&gt;
&lt;li&gt;When bugs show up and you tell the AI to fix them, does the debugging ever actually end?&lt;/li&gt;
&lt;li&gt;Are you quietly hand-fixing AI-generated code line by line?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...Yeah, that was me until last year (lol)&lt;/p&gt;

&lt;p&gt;Hoping to save others from the same trap, here's a breakdown of SDD (Spec-Driven Development) and A-SDLC (Agentic SDLC) — the backbone of AIDD (AI-Driven Development).&lt;/p&gt;

&lt;p&gt;
  Terminology
  &lt;p&gt;AIDD : AI-Driven Development. A development style where AI leads dev tasks and humans supervise and evaluate.&lt;br&gt;&lt;br&gt;
SDD : Spec-Driven Development. An approach where the spec drives design, implementation, and testing.&lt;br&gt;&lt;br&gt;
A-SDLC : Agentic SDLC. A development style where AI agents autonomously execute the entire Software Development Life Cycle.&lt;/p&gt;



&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Let's get straight to the point.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SDD lives or dies by its spec template and process — and the process can be automated by AI
&lt;/h2&gt;

&lt;p&gt;Here's a bad flow vs. a good flow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fez4e6ausk5zlondxp73d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fez4e6ausk5zlondxp73d.png" alt="bad flow vs. a good flow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before: humans test, tell AI to fix, test again... infinite loop.&lt;br&gt;&lt;br&gt;
After: &lt;strong&gt;a separate AI agent inspects quality before moving to the next phase&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
I wrote "inspection" here, not "review." This is closer to &lt;strong&gt;inspection&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
 — a formal examination with checklists, severity classifications, and pass/fail criteria defined (IEEE 1028).&lt;/p&gt;

&lt;p&gt;That's what AI should be doing. There are check items, and the gate won't open unless Critical/High findings are zero.&lt;/p&gt;

&lt;p&gt;Even in human team development, quality suffers when one person does everything. The same applies to AI-driven development.&lt;br&gt;
In A-SDLC, the key is to &lt;strong&gt;clearly separate phases and roles across multiple AI agents&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  A sample of AI Agent Team
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftir5ryrsuv4rhwedmc7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftir5ryrsuv4rhwedmc7n.png" alt="AI Agent Team"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Quality Gates = Inspection Criteria
&lt;/h3&gt;

&lt;p&gt;Specifically, the inspection agent examines from 6 perspectives:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perspective&lt;/th&gt;
&lt;th&gt;What it checks&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R1&lt;/td&gt;
&lt;td&gt;Spec quality&lt;/td&gt;
&lt;td&gt;Requirements have IDs? No ambiguous wording? Edge cases covered?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2&lt;/td&gt;
&lt;td&gt;Design principles&lt;/td&gt;
&lt;td&gt;Any SRP, OCP, DIP, DRY, KISS, YAGNI violations?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R3&lt;/td&gt;
&lt;td&gt;Code quality&lt;/td&gt;
&lt;td&gt;Error handling, null safety, defensive programming&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R4&lt;/td&gt;
&lt;td&gt;State transitions&lt;/td&gt;
&lt;td&gt;Deadlocks, race conditions, missing state transitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R5&lt;/td&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Algorithm efficiency, memory, network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R6&lt;/td&gt;
&lt;td&gt;Consistency&lt;/td&gt;
&lt;td&gt;Spec ↔ design ↔ implementation ↔ tests — all connected?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;If even one Critical/High issue remains, the next phase is blocked.&lt;/strong&gt; That's the quality gate.&lt;/p&gt;

&lt;p&gt;Using the &lt;strong&gt;OSS framework &lt;a href="https://github.com/GoodRelax/gr-sw-maker" rel="noopener noreferrer"&gt;gr-sw-maker&lt;/a&gt;&lt;/strong&gt; which implements this approach, I'll walk through a real example: building an &lt;a href="https://goodrelax.github.io/gr-sw-maker-examples/earthquake-map/" rel="noopener noreferrer"&gt;&lt;strong&gt;earthquake map site&lt;/strong&gt;&lt;/a&gt; in just 45 minutes (10 min hands-on).&lt;/p&gt;


&lt;h2&gt;
  
  
  ① Have AI write the spec — incrementally, with inspections in between
&lt;/h2&gt;

&lt;p&gt;The "S" in SDD. This is the foundation. If your AI-driven dev or SDD isn't producing results, this is where it's weak.&lt;/p&gt;
&lt;h3&gt;
  
  
  The spec "template" is everything
&lt;/h3&gt;

&lt;p&gt;For human specs, IEEE 830 (SRS) is well-known, but it was designed for humans to read and write.&lt;br&gt;
The chapter structure is too heavy, granularity varies... Hand this to an AI and it becomes a hallucination factory.&lt;/p&gt;

&lt;p&gt;So I created &lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/process-rules/spec-template-en.md" rel="noopener noreferrer"&gt;ANMS (AI-Native Minimal Spec)&lt;/a&gt;, a spec template designed for AI.&lt;br&gt;
&lt;strong&gt;Clean Architecture's Stable Dependencies Principle is applied to the spec itself — upper layers (purpose, requirements) are stable, lower layers (design, tests) are easy to change.&lt;/strong&gt;&lt;br&gt;
...This is a unique design choice in gr-sw-maker.&lt;/p&gt;

&lt;p&gt;Even with this spec, having AI write it all at once will fail.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First, have it write purpose and requirements (Ch1-2) and pass inspection.&lt;/li&gt;
&lt;li&gt;Then proceed to design and test strategy (Ch3-6).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the foundation is shaky and you proceed to design, you'll redo everything later. ...Sound familiar?&lt;/p&gt;
&lt;h3&gt;
  
  
  Natural language makes AI guess wrong
&lt;/h3&gt;

&lt;p&gt;If you write:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Change marker color based on earthquake size&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What's "size"? What are the thresholds? What colors? AI interprets freely, producing something different every time.&lt;/p&gt;
&lt;h3&gt;
  
  
  EARS notation eliminates ambiguity
&lt;/h3&gt;

&lt;p&gt;The same requirement in &lt;a href="https://alistairmavin.com/ears/" rel="noopener noreferrer"&gt;EARS (Easy Approach to Requirements Syntax)&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;FR-05:&lt;/strong&gt; The system &lt;strong&gt;SHALL&lt;/strong&gt; display each earthquake marker with a color determined by magnitude: green for below 3.0, yellow for 3.0–5.0, orange for 5.0–7.0, red for 7.0 and above.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Subject, verb, conditions, thresholds — all there. No room for AI misinterpretation. (&lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/blob/master/earthquake-map/docs/spec/earthquake-map-spec.md#2-requirements" rel="noopener noreferrer"&gt;Actual spec Ch2&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;
  EARS examples (most requirements can be written with these patterns)
  &lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Syntax&lt;/th&gt;
&lt;th&gt;Example (actual)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubiquitous&lt;/td&gt;
&lt;td&gt;The system SHALL...&lt;/td&gt;
&lt;td&gt;Display map with Leaflet.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event&lt;/td&gt;
&lt;td&gt;When [event], the system SHALL...&lt;/td&gt;
&lt;td&gt;Marker click → show popup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;While [state], the system SHALL...&lt;/td&gt;
&lt;td&gt;During data fetch → show loading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unwanted&lt;/td&gt;
&lt;td&gt;If [condition], then the system SHALL...&lt;/td&gt;
&lt;td&gt;API failure → show error message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Constraint&lt;/td&gt;
&lt;td&gt;The system SHALL NOT...&lt;/td&gt;
&lt;td&gt;Reject future dates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;/p&gt;

&lt;h3&gt;
  
  
  After writing the spec, have it inspected
&lt;/h3&gt;

&lt;p&gt;The completed spec is examined by a dedicated agent. Here's an actual finding:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;F-002 (Medium):&lt;/strong&gt; FR-05 mentions "color gradient" but thresholds are undefined. Cannot be tested.&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Specify green for below 3.0, yellow for 3.0–5.0...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This kind of ambiguity is eliminated through AI-to-AI inspection before moving to the next phase.&lt;br&gt;
A human would take ages, but AI finishes this inspection in seconds. That's the power of A-SDLC.&lt;br&gt;
(&lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/blob/master/earthquake-map/project-records/reviews/review-spec-ch1-2-20260322.md" rel="noopener noreferrer"&gt;Actual example&lt;/a&gt;)&lt;/p&gt;


&lt;h2&gt;
  
  
  ② Have AI design — expressing Clean Architecture with colors
&lt;/h2&gt;

&lt;p&gt;Once the spec is solid, the design agent creates the architecture.&lt;/p&gt;

&lt;p&gt;A unique feature of &lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/essays/anms-essay-en.md" rel="noopener noreferrer"&gt;ANMS&lt;/a&gt; is &lt;strong&gt;color-coding components by layer&lt;/strong&gt;. This makes dependency direction violations instantly visible.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Critical: At the architecture design stage, separate means from ends and organize dependencies into a clean architecture. This makes the system resilient to bug fixes and spec changes.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3xzz6tpfspn8ry510ft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3xzz6tpfspn8ry510ft.png" alt="clean architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Domain layer (orange) is pure functions with zero external dependencies. Dependency direction flows UI → Adapter → Domain, never reversed.&lt;br&gt;
If colors are mixed up, the design is wrong. The inspection agent checks this too.&lt;br&gt;
(&lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/blob/master/earthquake-map/docs/spec/earthquake-map-spec.md#3-architecture" rel="noopener noreferrer"&gt;Actual design Ch3&lt;/a&gt;)&lt;/p&gt;


&lt;h2&gt;
  
  
  ③ Derive test cases from the spec
&lt;/h2&gt;

&lt;p&gt;This is the best part.&lt;/p&gt;

&lt;p&gt;gr-sw-maker has test specifications written in Gherkin notation, so test code can be derived directly from the spec.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;SC-005 Marker color by magnitude (traces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;FR-05)&lt;/span&gt;
  &lt;span class="nf"&gt;Given &lt;/span&gt;earthquake data has been successfully fetched
  &lt;span class="nf"&gt;Then &lt;/span&gt;markers for magnitude below 3.0 are displayed in green
  &lt;span class="nf"&gt;And &lt;/span&gt;markers for magnitude 3.0–5.0 are displayed in yellow
  &lt;span class="nf"&gt;And &lt;/span&gt;markers for magnitude 5.0–7.0 are displayed in orange
  &lt;span class="nf"&gt;And &lt;/span&gt;markers for magnitude 7.0 and above are displayed in red
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each line of Gherkin becomes a test case. (&lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/blob/master/earthquake-map/docs/spec/earthquake-map-spec.md#4-specification" rel="noopener noreferrer"&gt;Actual spec Ch4&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;
  Auto-generated test code
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;magnitudeToColor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../src/domain/magnitude-scale.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;magnitudeToColor&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;returns green (#00CC00) for magnitude below 3.0&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;magnitudeToColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.9&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#00CC00&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="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;returns yellow (#CCCC00) for magnitude 3.0 to 4.9&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;magnitudeToColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#CCCC00&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="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;returns orange (#FF8800) for magnitude 5.0 to 6.9&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;magnitudeToColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;6.0&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#FF8800&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="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;returns red (#CC0000) for magnitude 7.0 and above&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;magnitudeToColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;7.5&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#CC0000&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;Similar to TDD (Test-Driven Development), gr-sw-maker creates test cases (acceptance criteria) before implementation.&lt;br&gt;
The goal — what tests to pass — is defined before coding begins, minimizing rework.&lt;/p&gt;



&lt;/p&gt;

&lt;p&gt;What's also important here: &lt;strong&gt;the implementing agent and the testing agent are separate&lt;/strong&gt;.&lt;br&gt;
The problem of testing your own code is structurally eliminated. (&lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/tree/master/earthquake-map/tests" rel="noopener noreferrer"&gt;Actual test code&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Statement coverage: 98.93% (domain + adapter layers, target was 80%). Since tests are derived from Gherkin scenarios, coverage structurally matches what's specified.&lt;/p&gt;
&lt;h3&gt;
  
  
  Implementation inspection results
&lt;/h3&gt;

&lt;p&gt;Inspection results for the earthquake-map implementation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Verdict&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;PASS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Critical/High is 0, so it passes. Medium/Low are recorded and carried forward. (&lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/blob/master/earthquake-map/project-records/reviews/implementation-review-20260322.md" rel="noopener noreferrer"&gt;Actual inspection record&lt;/a&gt;)&lt;/p&gt;


&lt;h2&gt;
  
  
  ④ The full run — results
&lt;/h2&gt;

&lt;p&gt;So what actually happened? I built an earthquake map app from a 5-line memo.&lt;br&gt;
Here's the summary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initial input (this is all):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Earthquake Map
I want to see where and when earthquakes happened in the world.
Runs in the browser only. No server.
I want to zoom into any area.
I want to specify a time span.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Two spec changes mid-development:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add an Update button&lt;/li&gt;
&lt;li&gt;Make it work on local PC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Functional requirements&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gherkin scenarios&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unit tests&lt;/td&gt;
&lt;td&gt;32 (100% pass)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code coverage&lt;/td&gt;
&lt;td&gt;98.93%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerabilities&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total time&lt;/td&gt;
&lt;td&gt;45 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I didn't write a single line of code. Didn't even look at it (lol)&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://goodrelax.github.io/gr-sw-maker-examples/earthquake-map/" rel="noopener noreferrer"&gt;Live app&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
📝 &lt;a href="https://zenn.dev/good_relax/articles/d47360b4f45b33" rel="noopener noreferrer"&gt;Introduction article (Zenn)&lt;/a&gt;&lt;br&gt;
📄 &lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/blob/master/earthquake-map/docs/spec/earthquake-map-spec.md" rel="noopener noreferrer"&gt;Spec (with component &amp;amp; sequence diagrams)&lt;/a&gt;&lt;br&gt;
💬 &lt;a href="https://goodrelax.github.io/gr-sw-maker-examples/earthquake-map/project-records/transcript/session-transcript.html" rel="noopener noreferrer"&gt;Full AI chat transcript&lt;/a&gt;&lt;br&gt;
📊 &lt;a href="https://goodrelax.github.io/gr-sw-maker-examples/earthquake-map/project-records/transcript/project-timeline-en.html" rel="noopener noreferrer"&gt;Timeline &amp;amp; metrics&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sounds easy so far, but...&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What this article covered is just part of the picture. Under the hood, multiple AI sub-agents are orchestrated in complex ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  The full picture of gr-sw-maker
&lt;/h3&gt;

&lt;p&gt;You don't need to read everything at these links, but &lt;strong&gt;at least look at the diagrams&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/process-rules/spec-template-en.md" rel="noopener noreferrer"&gt;ANMS (spec template)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The quality pillar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/process-rules/agent-list-en.md" rel="noopener noreferrer"&gt;Agent configuration (20+)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Agents and their coordination flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker/tree/main/.claude/agents" rel="noopener noreferrer"&gt;Agent implementations&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Prompts for each agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/process-rules/full-auto-dev-process-rules-en.md" rel="noopener noreferrer"&gt;Process rules&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Discipline for agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/process-rules/review-standards-en.md" rel="noopener noreferrer"&gt;Review standards&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Inspection criteria&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/process-rules/full-auto-dev-document-rules-en.md" rel="noopener noreferrer"&gt;Document management rules&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Artifact types, naming, versioning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Binding AI agents with strict rules might seem harsh. But just like human projects, it's what prevents death marches and leads to happier development.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⑤ Have AI reflect — AI improving its own process
&lt;/h2&gt;

&lt;p&gt;gr-sw-maker doesn't stop here.&lt;br&gt;
After development, AI runs a retrospective.&lt;br&gt;
...You do that in human projects too, right? (lol)&lt;/p&gt;

&lt;p&gt;Improvement proposals from the earthquake-map retrospective:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IP-01&lt;/td&gt;
&lt;td&gt;ES modules didn't work with file://, causing a full redo&lt;/td&gt;
&lt;td&gt;Add compatibility check in early phases for "no server" projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP-02&lt;/td&gt;
&lt;td&gt;Ambiguity between auto-fetch vs. button-triggered data loading&lt;/td&gt;
&lt;td&gt;Add trigger method question to interview template&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP-03&lt;/td&gt;
&lt;td&gt;Leaflet's async rendering caused screenshot verification timeouts&lt;/td&gt;
&lt;td&gt;Document screenshot limitations for async UIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP-04&lt;/td&gt;
&lt;td&gt;No procedure for closing inspection findings&lt;/td&gt;
&lt;td&gt;Make finding closure an explicit orchestrator step&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All of these were identified by AI itself. It even produced a gap analysis of the gr-sw-maker framework (4 SDD items + 6 A-SDLC items).&lt;br&gt;
(The retrospective is recorded at the end of the &lt;a href="https://goodrelax.github.io/gr-sw-maker-examples/earthquake-map/project-records/transcript/session-transcript.html" rel="noopener noreferrer"&gt;chat transcript&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;These findings feed back into the next project, and the framework itself improves over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges ahead
&lt;/h2&gt;

&lt;p&gt;The retrospective surfaced these honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;: More agents means more token consumption. It's a speed-vs-quality tradeoff.&lt;br&gt;
→ I accept this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Process gaps&lt;/strong&gt;: Like IP-04, the procedure for closing inspection findings is still weak.&lt;br&gt;
→ Run more diverse projects, retrospect, and close the gaps.&lt;br&gt;
...Humans hate this kind of grunt work, but AI doesn't complain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-language&lt;/strong&gt;: Spec templates and prompts are written in both Japanese and English, so AI translation enables other languages.&lt;br&gt;
I actually developed gr-sw-maker in Japanese and translated to English. The earthquake map was developed in English.&lt;br&gt;
→ Next I'd like to try German or Chinese (whichever has better translation accuracy).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Beyond Claude Code&lt;/strong&gt;: Designed to avoid vendor lock-in so it works with other AI tools, though porting is needed (~15%). Naturally, AI does the porting.&lt;br&gt;
See the &lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/process-rules/porting-guide-en.md" rel="noopener noreferrer"&gt;porting guide&lt;/a&gt; for details.&lt;br&gt;
→ Maybe Cursor next?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scaling up&lt;/strong&gt;: Applying to complex, large-scale multi-service systems. A single spec won't suffice — multiple specs (&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/essays/anms-essay-en.md" rel="noopener noreferrer"&gt;ANPS&lt;/a&gt;) or graph specs (&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/essays/angs-essay-en.md" rel="noopener noreferrer"&gt;ANGS&lt;/a&gt;) will be needed.&lt;br&gt;
→ This is where individual effort hits its limits. Both money and time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Human judgment remains&lt;/strong&gt;: Acceptance testing and final decisions are human. It's nearly fully automated, but not unmanned.&lt;br&gt;
→ &lt;strong&gt;Critical: You need enough skill to review AI-inspected artifacts and make the AI say "you're absolutely right."&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Quality collapses because you have AI write code immediately.&lt;/li&gt;
&lt;li&gt;Separate agents for spec → SW design &amp;amp; test design → implementation → testing.&lt;/li&gt;
&lt;li&gt;Set up quality gates between phases with inspection every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's exactly what human development does. Just have AI do it faithfully.&lt;/p&gt;

&lt;p&gt;Well, &lt;strong&gt;getting that to actually work is surprisingly tricky&lt;/strong&gt; (lol)&lt;br&gt;
When it is, try &lt;strong&gt;gr-sw-maker&lt;/strong&gt; as a starting point.&lt;br&gt;
I hope it makes your development easier and your products better.&lt;/p&gt;




&lt;h3&gt;
  
  
  Try it now
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init gr-sw-maker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker" rel="noopener noreferrer"&gt;GitHub: gr-sw-maker&lt;/a&gt;&lt;/strong&gt; — OSS MIT License, Japanese &amp;amp; English&lt;br&gt;
→ &lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/README-ja.md" rel="noopener noreferrer"&gt;GitHub (Japanese README)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples" rel="noopener noreferrer"&gt;GitHub: Examples&lt;/a&gt;&lt;br&gt;
→ Example 1: &lt;a href="https://goodrelax.github.io/gr-sw-maker-examples/earthquake-map/" rel="noopener noreferrer"&gt;Earthquake Map Site&lt;/a&gt; and &lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/tree/master/earthquake-map" rel="noopener noreferrer"&gt;dev records&lt;/a&gt;&lt;br&gt;
→ Example 2: &lt;a href="https://goodrelax.github.io/gr-sw-maker-examples/mahjong-dice/src/index.html" rel="noopener noreferrer"&gt;Mahjong Dice App&lt;/a&gt; and &lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/tree/master/mahjong-dice" rel="noopener noreferrer"&gt;dev records&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Standards and concepts referenced in this article&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://standards.ieee.org/ieee/830/1222/" rel="noopener noreferrer"&gt;IEEE 830 (SRS)&lt;/a&gt; — Standard format for software requirements specifications&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://standards.ieee.org/ieee/1028/988/" rel="noopener noreferrer"&gt;IEEE 1028&lt;/a&gt; — Standard process for software reviews and inspections&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc2119" rel="noopener noreferrer"&gt;RFC 2119&lt;/a&gt; — Keywords for requirement levels (SHALL / SHOULD / MAY)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://alistairmavin.com/ears/" rel="noopener noreferrer"&gt;EARS (Easy Approach to Requirements Syntax)&lt;/a&gt; — Notation for writing requirements in structured natural language&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cucumber.io/docs/gherkin/reference/" rel="noopener noreferrer"&gt;Gherkin (Cucumber)&lt;/a&gt; — Scenario description language using Given/When/Then&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html" rel="noopener noreferrer"&gt;Clean Architecture (Robert C. Martin)&lt;/a&gt; — Architecture pattern controlling dependency direction&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/essays/anms-essay-en.md" rel="noopener noreferrer"&gt;ANMS (AI-Native Minimal Spec)&lt;/a&gt; — Spec template for AI-driven development&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/essays/angs-essay-en.md" rel="noopener noreferrer"&gt;ANGS (AI-Native Graph Spec)&lt;/a&gt; — Graph spec for large-scale multi-service systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;© 2026 GoodRelax. MIT License.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>testing</category>
      <category>opensource</category>
    </item>
    <item>
      <title>SDD: AI Turned My 5-Line Memo into Specs and Software in 45 Minutes by gr-sw-maker</title>
      <dc:creator>GoodRelax</dc:creator>
      <pubDate>Sun, 22 Mar 2026 10:26:48 +0000</pubDate>
      <link>https://forem.com/goodrelax/ai-turned-my-5-line-memo-into-specs-and-software-in-45-minutes-1l95</link>
      <guid>https://forem.com/goodrelax/ai-turned-my-5-line-memo-into-specs-and-software-in-45-minutes-1l95</guid>
      <description>&lt;p&gt;&lt;strong&gt;First, take a look at this.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;👉 &lt;a href="https://goodrelax.github.io/gr-sw-maker-examples/earthquake-map/" rel="noopener noreferrer"&gt;Earthquake Map&lt;/a&gt;&lt;/strong&gt; ← created using &lt;strong&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker" rel="noopener noreferrer"&gt;gr-sw-maker&lt;/a&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built from a 5-line memo in 45 minutes. With a spec and tests.&lt;/strong&gt;&lt;br&gt;
And my actual hands-on time was &lt;strong&gt;under 10 minutes&lt;/strong&gt;. Spent the rest drinking beer.&lt;br&gt;
This is SDD meets Agentic SDLC.&lt;br&gt;
According to &lt;a href="https://www.pwc.com/m1/en/publications/2026/docs/future-of-solutions-dev-and-delivery-in-the-rise-of-gen-ai.pdf" rel="noopener noreferrer"&gt;PwC's 2026 report&lt;/a&gt;, by 2027 more than half of all teams will develop this way.&lt;/p&gt;

&lt;p&gt;
  Terminology
  &lt;ul&gt;
&lt;li&gt;Agentic SDLC = A development style where AI agents autonomously execute the entire SDLC. Proposed by PwC, Microsoft, and others.&lt;/li&gt;
&lt;li&gt;Agentic = Given a goal, the AI keeps acting autonomously to achieve it.&lt;/li&gt;
&lt;li&gt;SDLC = Software Development Life Cycle (requirements → design → implementation → testing → operations).&lt;/li&gt;
&lt;li&gt;SDD = Spec-Driven Development. Covers only the design → implementation portion. Narrower scope than SDLC.&lt;/li&gt;
&lt;li&gt;PwC = PricewaterhouseCoopers (Big Four consultancy).&lt;/li&gt;
&lt;/ul&gt;



&lt;/p&gt;




&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;I wanted to test a simple question: &lt;strong&gt;can AI go from a vague idea to a production-quality app — with specs and tests — in under an hour?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built an open-source framework called &lt;a href="https://github.com/GoodRelax/gr-sw-maker" rel="noopener noreferrer"&gt;gr-sw-maker&lt;/a&gt; and put it to the test.&lt;/p&gt;




&lt;h3&gt;
  
  
  What?
&lt;/h3&gt;

&lt;p&gt;A single &lt;code&gt;.html&lt;/code&gt; file app that reads open data (USGS Earthquake API) and draws a world earthquake map.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zoomable world map&lt;/li&gt;
&lt;li&gt;Time range selection (1 hour to 30 days, plus custom)&lt;/li&gt;
&lt;li&gt;Minimum magnitude filter&lt;/li&gt;
&lt;li&gt;No server — runs entirely in the browser&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  How?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Install &lt;a href="https://github.com/GoodRelax/gr-sw-maker" rel="noopener noreferrer"&gt;gr-sw-maker&lt;/a&gt; via npm
&lt;/h4&gt;

&lt;p&gt;Details → &lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; npm init gr-sw-maker earthquake-map
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;earthquake-map
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; node setup.js
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 1 : &lt;span class="c"&gt;# Develop in English using Claude Code&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Write a &lt;strong&gt;5-line memo (requirements doc)&lt;/strong&gt; for gr-sw-maker
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Earthquake Map
I want to see where and when earthquakes happened in the world.
Runs in the browser only. No server.
I want to zoom into any area.
I want to specify a time span.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Original memo → &lt;a href="https://raw.githubusercontent.com/GoodRelax/gr-sw-maker-examples/refs/heads/master/earthquake-map/user-order.md" rel="noopener noreferrer"&gt;user-order.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Answer the AI's interview questions and say "Do as you recommended!"
&lt;/h4&gt;

&lt;h4&gt;
  
  
  4. After that, I requested two spec changes (added an Update button, enabled file:// direct opening)
&lt;/h4&gt;

&lt;h4&gt;
  
  
  5. Also had it write a &lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/blob/master/earthquake-map/docs/framework-improvement-proposal-20260322.md" rel="noopener noreferrer"&gt;process improvement report&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Time breakdown
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Install gr-sw-maker &amp;amp; write requirements memo&lt;/td&gt;
&lt;td&gt;~5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interview → software delivery&lt;/td&gt;
&lt;td&gt;20 min 10 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acceptance testing &amp;amp; 2 revisions → done&lt;/td&gt;
&lt;td&gt;20 min 15 sec &lt;strong&gt;← 45 min total&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retrospective &amp;amp; improvement proposal report&lt;/td&gt;
&lt;td&gt;16 min 54 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Deliverables
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Functional requirements&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gherkin scenarios&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unit tests&lt;/td&gt;
&lt;td&gt;32 (100% pass)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code coverage&lt;/td&gt;
&lt;td&gt;98.93%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerabilities&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Evidence
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/blob/master/earthquake-map/docs/spec/earthquake-map-spec.md" rel="noopener noreferrer"&gt;Spec&lt;/a&gt; &lt;strong&gt;← includes component diagrams &amp;amp; sequence diagrams&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goodrelax.github.io/gr-sw-maker-examples/earthquake-map/project-records/transcript/session-transcript.html" rel="noopener noreferrer"&gt;Chat transcript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goodrelax.github.io/gr-sw-maker-examples/earthquake-map/project-records/transcript/project-timeline-en.html" rel="noopener noreferrer"&gt;Timeline &amp;amp; metrics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  So... is it any good?
&lt;/h3&gt;

&lt;p&gt;Honestly... It's a common enough app — but that's the point. It was &lt;strong&gt;built from a 5-line memo in 45 minutes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And it comes with a proper spec, test results, and even a process improvement report.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Naturally, I didn't write or even look at a single line of code.&lt;/p&gt;




&lt;h3&gt;
  
  
  "But is it just a toy?"
&lt;/h3&gt;

&lt;p&gt;Fair question. Speed means nothing if the output is garbage. Here's what's actually going on under the hood:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;21 AI agents working as a team&lt;/strong&gt; — not a single model chatting with you. There's an architect, a security reviewer, a test engineer, a risk manager, and more. Each owns a specific responsibility, just like a real dev team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 quality gates (R1–R6)&lt;/strong&gt; block phase transitions. Critical or High findings = 0, or the project doesn't move forward. No shortcuts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8-phase workflow&lt;/strong&gt; covering the full SDLC — from requirements interview through design, implementation, testing, delivery, and even post-delivery retrospectives.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/process-rules/full-auto-dev-process-rules-en.md" rel="noopener noreferrer"&gt;Process rules&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI-native spec format (ANMS)&lt;/strong&gt; — not a dumbed-down template. It uses EARS for requirements, Mermaid for architecture diagrams, and Gherkin for acceptance criteria. Purpose-built for LLMs to both write and consume.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/process-rules/spec-template-en.md" rel="noopener noreferrer"&gt;ANMS format&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portable&lt;/strong&gt; — built for Claude Code, but roughly 70% of the framework runs as-is on Gemini CLI, Cursor, Windsurf, and others.&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/GoodRelax/gr-sw-maker/blob/main/process-rules/porting-guide-en.md" rel="noopener noreferrer"&gt;Porting guide included&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That's how a 5-line memo produced 98.93% coverage and 0 vulnerabilities.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;It's not magic — it's process&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/GoodRelax/gr-sw-maker/tree/main/process-rules" rel="noopener noreferrer"&gt;A set of rules&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Thoughts
&lt;/h3&gt;

&lt;p&gt;I know what some of you are thinking: "Great, another tool that's going to replace me."&lt;/p&gt;

&lt;p&gt;But let's be real — someone somewhere has already built something like this earthquake map. Are you really excited to reinvent that wheel for the hundredth time? I'm not.&lt;/p&gt;

&lt;p&gt;What excites me is: &lt;strong&gt;what do you do with the time you get back?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's the microplastic crisis, fusion power instead of fossil fuels — we've got real problems worth solving. The boring plumbing shouldn't be what eats your week.&lt;/p&gt;

&lt;p&gt;This was a simple demo. Next, I'm going to throw something harder at it — multi-service architecture, real-time data pipelines — and see where it breaks. That's where things get interesting.&lt;/p&gt;

&lt;p&gt;The world's going to shift a lot in the next few years. If &lt;a href="https://github.com/GoodRelax/gr-sw-maker" rel="noopener noreferrer"&gt;gr-sw-maker&lt;/a&gt; helps even one person skip the boring parts, that's a win.&lt;/p&gt;


&lt;h3&gt;
  
  
  Try it yourself
&lt;/h3&gt;

&lt;p&gt;You need Node.js and &lt;a href="https://docs.anthropic.com/en/docs/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;. That's it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init gr-sw-maker my-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
node setup.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Write your own 5-line memo, answer the interview, and see what comes out. If you build something cool, open a PR to &lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples" rel="noopener noreferrer"&gt;gr-sw-maker-examples&lt;/a&gt; — I'd love to see it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🛠️ &lt;a href="https://github.com/GoodRelax/gr-sw-maker" rel="noopener noreferrer"&gt;gr-sw-maker&lt;/a&gt;&lt;/strong&gt; &lt;strong&gt;← OSS · MIT License · English + Japanese&lt;/strong&gt; — contributors welcome.&lt;/li&gt;
&lt;li&gt;🌍 &lt;a href="https://github.com/GoodRelax/gr-sw-maker-examples/tree/master/earthquake-map" rel="noopener noreferrer"&gt;Earthquake Map project&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>ANMS : A Spec Template Built for AI</title>
      <dc:creator>GoodRelax</dc:creator>
      <pubDate>Sun, 08 Mar 2026 14:02:39 +0000</pubDate>
      <link>https://forem.com/goodrelax/a-spec-template-built-for-ai-3bkp</link>
      <guid>https://forem.com/goodrelax/a-spec-template-built-for-ai-3bkp</guid>
      <description>&lt;h3&gt;
  
  
  EARS + Gherkin + Mermaid, reorganized for AI-driven development.
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Why I Made This
&lt;/h2&gt;

&lt;p&gt;I build software with Claude Code, and it hit me:&lt;/p&gt;

&lt;p&gt;AI coding is the same process as outsourcing. Spec → Build → Review → Accept. Whether the builder is a team overseas or an LLM on your machine — same flow, same failure modes.&lt;/p&gt;

&lt;p&gt;The quality of outsourced software comes down to three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The vendor's capability&lt;/li&gt;
&lt;li&gt;The development process&lt;/li&gt;
&lt;li&gt;The spec&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Number 1? Claude Code. No complaints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/GoodRelax/claude-code-full-auto-dev" rel="noopener noreferrer"&gt;Number 2? Working on it.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Number 3 is the problem. Too vague → the AI hallucinates features you never asked for. Too verbose → it drowns in context and loses sight of what matters.&lt;/p&gt;

&lt;p&gt;IEEE 29148 specs are rigorous, but feed 200 pages to an LLM and it gets lost. A casual "make me a Todo app" works — until auth and state machines show up, then everything breaks.&lt;/p&gt;

&lt;p&gt;What I learned after trying many formats: &lt;strong&gt;traditional spec templates weren't designed for AI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So what &lt;em&gt;does&lt;/em&gt; an AI need from a spec? That question led me to build…&lt;/p&gt;

&lt;h2&gt;
  
  
  ANMS — AI-Native Minimal Spec
&lt;/h2&gt;

&lt;p&gt;A spec template that reorganizes existing notations — EARS, Gherkin, Mermaid — for AI-driven development.&lt;/p&gt;

&lt;p&gt;Each notation is someone else's brilliant work. What I did: through months of near-full-auto development, I mapped out where AI gets confused, assigned the best notation to each layer, and structured the chapters using Clean Architecture principles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stable Top, Flexible Bottom
&lt;/h2&gt;

&lt;p&gt;Not every part of a spec changes at the same rate.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project goals and constraints → rarely change&lt;/li&gt;
&lt;li&gt;Gherkin scenarios → change all the time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So why treat them with equal weight?&lt;/p&gt;

&lt;p&gt;I applied Robert C. Martin's &lt;strong&gt;Stable Dependencies Principle&lt;/strong&gt; (SDP) — depend on stable things, not unstable ones — to document structure instead of code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ch1  Foundation        ← Rigid: rarely changes
Ch2  Requirements
Ch3  Architecture
Ch4  Specification     ← Flexible: changes often
Ch5  Test Strategy
Ch6  Design Principles ← Becomes AI's code review criteria
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upper chapters constrain lower ones. Never the reverse.&lt;/p&gt;

&lt;p&gt;Change a Gherkin scenario in Ch4 → Ch1 and Ch2 are untouched.&lt;br&gt;
Change the Goal in Ch1 → everything below needs review.&lt;/p&gt;

&lt;p&gt;Applying SDP to &lt;em&gt;documents&lt;/em&gt;, not code — that's the key. It tells the AI &lt;strong&gt;which context takes priority&lt;/strong&gt;, structurally.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Right Notation for Each Layer
&lt;/h2&gt;

&lt;p&gt;One notation can't cover everything. So I picked the best fit for each chapter — standing on the shoulders of giants.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chapter&lt;/th&gt;
&lt;th&gt;Notation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Natural language + tables&lt;/td&gt;
&lt;td&gt;Humans define goals, scope, constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EARS syntax&lt;/td&gt;
&lt;td&gt;Structured patterns eliminate ambiguity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mermaid (color-coded)&lt;/td&gt;
&lt;td&gt;Humans and AI sync on structure visually&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Specification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gherkin&lt;/td&gt;
&lt;td&gt;AI generates test code directly from this&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Ch1: Foundation — Natural Language + Tables
&lt;/h3&gt;

&lt;p&gt;Goal (what to build), Scope (how far), Constraint (what to respect). Plain language and tables.&lt;/p&gt;

&lt;p&gt;This is where you spend the most time — and it's worth it. The foundation is your intent, crystallized.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ch2: Requirements — EARS
&lt;/h3&gt;

&lt;p&gt;"The system shall handle errors appropriately."&lt;/p&gt;

&lt;p&gt;…&lt;em&gt;appropriately&lt;/em&gt;? Hand that to an AI and it'll do whatever it wants.&lt;/p&gt;

&lt;p&gt;EARS (Mavin et al., 2009) fixes this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;When&lt;/strong&gt; a collision with a forward obstacle is predicted within 1 second, &lt;strong&gt;the System shall&lt;/strong&gt; activate emergency braking immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;While&lt;/strong&gt; operating in autonomous mode, &lt;strong&gt;the System shall&lt;/strong&gt; maintain lane center within ±15 cm.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Six patterns. Zero ambiguity. Originally from embedded systems — turns out it's a perfect fit for AI-driven development.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ch3: Architecture — Mermaid
&lt;/h3&gt;

&lt;p&gt;In AI-driven development, a Mermaid diagram is &lt;strong&gt;not an illustration — it's the design itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The AI reads component diagrams to determine file splits, import paths, and dependency direction. ANMS requires color-coding by architectural layer — Mermaid's layout engine does its own thing, so without color, you can't tell which box belongs where.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ch4: Specification — Gherkin
&lt;/h3&gt;

&lt;p&gt;Gherkin scenarios serve as acceptance tests — and in TDD, implementation specs. Each scenario traces back to a requirement via &lt;code&gt;(traces: FR-xxx)&lt;/code&gt;, so nothing falls through the cracks.&lt;/p&gt;
&lt;h2&gt;
  
  
  Example: "The Chauffeur Car"
&lt;/h2&gt;

&lt;p&gt;Can't show the full spec here, but here's the concept-to-spec flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Foundation:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Provide the "just tell me where to go" experience — 24/7, no human driver.&lt;br&gt;
&lt;strong&gt;Constraint:&lt;/strong&gt; Emergency brake response ≤ 100 ms (ISO 22737).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Requirements (EARS):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When a collision with a forward obstacle is predicted within 1 second, the System shall activate emergency braking immediately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Sequence Diagram to Explain Architecture (Mermaid):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnb63agub5bas6zoq39d3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnb63agub5bas6zoq39d3.png" alt="Autonomous Car Sequence"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specification (Gherkin):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Chauffeur Mode

  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;SC-002 Emergency stop on forward obstacle (traces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;FR-003)&lt;/span&gt;
    &lt;span class="nf"&gt;Given &lt;/span&gt;the vehicle is in chauffeur mode driving at 40 km/h
    &lt;span class="nf"&gt;When &lt;/span&gt;a collision with a pedestrian ahead is predicted within 1 second
    &lt;span class="nf"&gt;Then &lt;/span&gt;the system activates emergency braking within 100 ms
    &lt;span class="nf"&gt;And &lt;/span&gt;the vehicle comes to a safe stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four steps. Concept to testable spec. The AI knows what to build, what to test, and what constraints to obey.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Humans Still Do
&lt;/h2&gt;

&lt;p&gt;Even in near-full-auto development, three things stay human:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Decide the concept&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make the critical calls&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review the output&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything else? Let the AI handle it. You review what matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;The template and essay (explaining &lt;em&gt;why&lt;/em&gt; this structure) are on GitHub.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/GoodRelax/claude-code-full-auto-dev" rel="noopener noreferrer"&gt;ANMS Template &amp;amp; Essay&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/GoodRelax/claude-code-full-auto-dev/tree/main/essays/anms-essay-ja.md" rel="noopener noreferrer"&gt;&lt;code&gt;anms-essay-ja.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Full essay (Japanese)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/GoodRelax/claude-code-full-auto-dev/tree/main/process-rules/spec-template-ja.md" rel="noopener noreferrer"&gt;&lt;code&gt;spec-template-ja.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Spec template (Japanese)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/GoodRelax/claude-code-full-auto-dev/tree/main/essays/anms-essay-en.md" rel="noopener noreferrer"&gt;&lt;code&gt;anms-essay-en.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Full essay (English) — rationale &amp;amp; comparison with existing formats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/GoodRelax/claude-code-full-auto-dev/tree/main/process-rules/spec-template-en.md" rel="noopener noreferrer"&gt;&lt;code&gt;spec-template-en.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Spec template (English)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Try it in your next AI-driven project. If you find improvements or different combos that work, I'd love to hear about them.&lt;/p&gt;

&lt;p&gt;I prefer building in the open — more fun that way.&lt;/p&gt;

&lt;p&gt;© 2026 GoodRelax. MIT License.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sdd</category>
      <category>specification</category>
      <category>development</category>
    </item>
    <item>
      <title>GRSMD: Markdown Viewer to Keep You in the Zone</title>
      <dc:creator>GoodRelax</dc:creator>
      <pubDate>Sun, 08 Mar 2026 12:03:32 +0000</pubDate>
      <link>https://forem.com/goodrelax/grsmd-markdown-viewer-to-keep-you-in-the-zone-9ni</link>
      <guid>https://forem.com/goodrelax/grsmd-markdown-viewer-to-keep-you-in-the-zone-9ni</guid>
      <description>&lt;h3&gt;
  
  
  Just press [R] to update AI result
&lt;/h3&gt;




&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;I have AI rewrite my docs all the time. &lt;br&gt;
VS Code preview works fine for a single file &lt;br&gt;
— but once you're juggling &lt;strong&gt;multiple .md files&lt;/strong&gt;, &lt;br&gt;
it gets sluggish with Mermaid diagrams, math blocks, and long files&lt;/p&gt;

&lt;p&gt;That little lag — just enough to break the flow.  &lt;/p&gt;

&lt;p&gt;With GRSMD, each file just opens in a new browser tab. No friction, no slowdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I built
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dev.to/goodrelax/grsmd-instant-markdown-viewer-local-private-4g8c"&gt;GRSMD&lt;/a&gt; is a Markdown viewer that runs entirely in your browser — no install, no backend.&lt;br&gt;
(Previous article: &lt;a href="https://dev.to/goodrelax/grsmd-instant-markdown-viewer-local-private-4g8c"&gt;GRSMD: Instant Markdown Viewer — Local &amp;amp; Private&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I just added a reload feature so you never have to re-drag a file again.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Drop a &lt;code&gt;.md&lt;/code&gt; onto GRSMD&lt;/li&gt;
&lt;li&gt;Have AI update the file (review comments, rewrites, whatever)&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;[R]&lt;/strong&gt; on GRSMD (or click the [Re-load] button)
→ The updated content re-renders — scroll position preserved&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Who is this for?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;use AI to draft or edit Markdown (docs, READMEs, blog posts)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;want to preview multiple files without leaving your browser&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You care about privacy — no data leaves your machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;a href="https://goodrelax.github.io/gr-simple-md-renderer/" rel="noopener noreferrer"&gt;https://goodrelax.github.io/gr-simple-md-renderer/&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qmuhreeyir3j903b0v1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qmuhreeyir3j903b0v1.png" alt="GRSMD Workflow" width="361" height="526"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Bonus — code files too
&lt;/h3&gt;

&lt;p&gt;Drop &lt;code&gt;.py&lt;/code&gt;, &lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.json&lt;/code&gt;, or any non-&lt;code&gt;.md&lt;/code&gt; text file&lt;br&gt;&lt;br&gt;
— you get syntax highlighting with line numbers. R key reloads these as well.&lt;/p&gt;

&lt;p&gt;Quietly useful for code review.&lt;/p&gt;




&lt;h3&gt;
  
  
  Shortcuts
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;R&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Reload file&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;Light mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;Dark mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;td&gt;New tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;↑ ↓&lt;/td&gt;
&lt;td&gt;Smooth scroll&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  What hasn't changed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No backend. No data collection.&lt;/li&gt;
&lt;li&gt;PlantUML is the only external call — always asks for consent first.&lt;/li&gt;
&lt;li&gt;Single HTML file. Zero install.&lt;/li&gt;
&lt;li&gt;Free. No ads. OSS.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Try it
&lt;/h3&gt;

&lt;p&gt;👉 &lt;a href="https://goodrelax.github.io/gr-simple-md-renderer/" rel="noopener noreferrer"&gt;https://goodrelax.github.io/gr-simple-md-renderer/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Samples:&lt;br&gt;
👉 &lt;a href="https://goodrelax.github.io/gr-simple-md-renderer/sample-data.md" rel="noopener noreferrer"&gt;https://goodrelax.github.io/gr-simple-md-renderer/sample-data.md&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://goodrelax.github.io/gr-simple-md-renderer/sample-data-2.md" rel="noopener noreferrer"&gt;https://goodrelax.github.io/gr-simple-md-renderer/sample-data-2.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub:&lt;br&gt;
👉 &lt;a href="https://github.com/GoodRelax/gr-simple-md-renderer" rel="noopener noreferrer"&gt;https://github.com/GoodRelax/gr-simple-md-renderer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Previous article:&lt;br&gt;
&lt;a href="https://dev.to/goodrelax/grsmd-instant-markdown-viewer-local-private-4g8c"&gt;GRSMD: Instant Markdown Viewer — Local &amp;amp; Private&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>GRSMD: Instant Markdown Viewer — Local &amp; Private</title>
      <dc:creator>GoodRelax</dc:creator>
      <pubDate>Sun, 01 Mar 2026 02:38:01 +0000</pubDate>
      <link>https://forem.com/goodrelax/grsmd-instant-markdown-viewer-local-private-4g8c</link>
      <guid>https://forem.com/goodrelax/grsmd-instant-markdown-viewer-local-private-4g8c</guid>
      <description>&lt;h2&gt;
  
  
  Update
&lt;/h2&gt;

&lt;p&gt;New features have been added.&lt;br&gt;
See the follow-up article: &lt;a href="https://dev.to/goodrelax/grsmd-markdown-viewer-to-keep-you-in-the-zone-9ni"&gt;GRSMD: Markdown Viewer to Keep You in the Zone&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;VS Code's &lt;code&gt;Ctrl+Shift+V&lt;/code&gt; works.&lt;br&gt;&lt;br&gt;
But you can't keep rendered previews open in separate browser tabs, and you can't view multiple documents side by side without splitting editor windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GRSMD&lt;/strong&gt; (GoodRelax Simple Markdown Renderer &amp;amp; Viewer) is a single &lt;code&gt;index.html&lt;/code&gt; file that opens in your browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Just drop a &lt;code&gt;.md&lt;/code&gt; file onto it or paste with &lt;code&gt;Ctrl+V&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;— it renders immediately.&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://goodrelax.github.io/gr-simple-md-renderer/" rel="noopener noreferrer"&gt;https://goodrelax.github.io/gr-simple-md-renderer/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/GoodRelax/gr-simple-md-renderer" rel="noopener noreferrer"&gt;https://github.com/GoodRelax/gr-simple-md-renderer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Press &lt;code&gt;[New Tab]&lt;/code&gt; for multiple documents.
&lt;/h4&gt;




&lt;h2&gt;
  
  
  What it renders
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Processed locally?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;marked.js 17.0.1&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mermaid diagrams&lt;/td&gt;
&lt;td&gt;Mermaid.js 11.12.2&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Syntax highlighting&lt;/td&gt;
&lt;td&gt;highlight.js 11.11.1&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LaTeX math&lt;/td&gt;
&lt;td&gt;KaTeX 0.16.25&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PlantUML&lt;/td&gt;
&lt;td&gt;plantuml.com&lt;/td&gt;
&lt;td&gt;Consent required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All rendering exept for PlantUML happens in your local browser.&lt;br&gt;&lt;br&gt;
No npm. No build. Just load libraries from CDN.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why it works better than VS Code preview for some workflows
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multiple tabs&lt;/strong&gt; — open several documents at once in separate browser tabs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drag and drop&lt;/strong&gt; — drop &lt;code&gt;.md&lt;/code&gt; files directly onto the editor or preview area&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paste&lt;/strong&gt; — &lt;code&gt;Ctrl+V&lt;/code&gt; drops Markdown straight into the editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Tab button&lt;/strong&gt; — clones the renderer into a fresh browser tab in one click&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zoom and pan&lt;/strong&gt; — &lt;code&gt;Ctrl+Scroll&lt;/code&gt; to zoom any diagram (0.5x to 5.0x), drag to pan, double-click to reset&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scroll preserved&lt;/strong&gt; — re-rendering does not jump you back to the top
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy diagrams to clipboard&lt;/strong&gt; — press &lt;code&gt;[Copy SVG]&lt;/code&gt; / &lt;code&gt;[Copy PNG]&lt;/code&gt; and paste it into PowerPoint etc.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Privacy model
&lt;/h2&gt;

&lt;p&gt;Nothing leaves your browser unless you allow it.&lt;br&gt;
Here's how the security model works:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6298et8yqc7ii80go7k7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6298et8yqc7ii80go7k7.png" alt="Privacy model" width="800" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PlantUML is the only exception — it requires the official PlantUML server to render.&lt;br&gt;&lt;br&gt;
A confirmation dialog appears before any data is sent.&lt;br&gt;&lt;br&gt;
Cancel it and everything else renders fine.&lt;/p&gt;




&lt;h2&gt;
  
  
  Special tip
&lt;/h2&gt;

&lt;p&gt;Long press the &lt;strong&gt;&lt;code&gt;[?]&lt;/code&gt;&lt;/strong&gt; button to improve your productivity with AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://goodrelax.github.io/gr-simple-md-renderer/" rel="noopener noreferrer"&gt;https://goodrelax.github.io/gr-simple-md-renderer/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick sample:&lt;/strong&gt; &lt;a href="https://goodrelax.github.io/gr-simple-md-renderer/sample-data.txt" rel="noopener noreferrer"&gt;https://goodrelax.github.io/gr-simple-md-renderer/sample-data.txt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full sample (Mermaid + PlantUML + LaTeX):&lt;/strong&gt; &lt;a href="https://goodrelax.github.io/gr-simple-md-renderer/sample-data-2.md" rel="noopener noreferrer"&gt;https://goodrelax.github.io/gr-simple-md-renderer/sample-data-2.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop one of the sample files onto the live page.&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Hide Any File in Two Images — Browser-Only, No Server</title>
      <dc:creator>GoodRelax</dc:creator>
      <pubDate>Sun, 22 Feb 2026 04:52:15 +0000</pubDate>
      <link>https://forem.com/goodrelax/hide-any-file-in-two-images-browser-only-no-server-15he</link>
      <guid>https://forem.com/goodrelax/hide-any-file-in-two-images-browser-only-no-server-15he</guid>
      <description>&lt;h2&gt;
  
  
  GRTM2CD 🗺️🐈🐕
&lt;/h2&gt;

&lt;h5&gt;
  
  
  GoodRelax Treasure Map to Cat and Dog
&lt;/h5&gt;

&lt;h3&gt;
  
  
  The Story
&lt;/h3&gt;

&lt;p&gt;What if you found a treasure map?&lt;br&gt;
You could ask a cat and a dog to each keep a piece.&lt;br&gt;
When you need the map, just call them both.&lt;/p&gt;

&lt;p&gt;I built a tool that does exactly that.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 &lt;strong&gt;&lt;a href="https://goodrelax.github.io/gr-tools/grtm2cd/" rel="noopener noreferrer"&gt;Try it now&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  What It Does
&lt;/h3&gt;

&lt;p&gt;This is a &lt;strong&gt;browser-only steganography tool&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It takes any file — PDF, ZIP,&lt;br&gt;&lt;br&gt;
whatever — and hides it across &lt;strong&gt;two ordinary PNG images&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You need both images to recover the file. Either one alone is useless.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffi8gpl28a73nebuizdt5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffi8gpl28a73nebuizdt5.png" alt="work flow" width="526" height="784"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;The process in one line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Compress → Encrypt (AES-256-GCM) → Split across two images → Embed in LSBs → Fill remaining capacity with noise&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each image looks like a normal PNG&lt;/li&gt;
&lt;li&gt;LSBs are indistinguishable from white noise&lt;/li&gt;
&lt;li&gt;Neither image alone reveals anything&lt;/li&gt;
&lt;li&gt;Both together reconstruct the original file perfectly&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Why Two Images?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capacity&lt;/strong&gt; — each image only needs to hold half the payload&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deniability&lt;/strong&gt; — no ciphertext continuity in either image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; — the AES key, IV, and ciphertext are all fragmented across both&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One image found? Just a photo. Two images found? Still just two photos — unless you know what to look for.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Browser-Only?
&lt;/h3&gt;

&lt;p&gt;No server means nothing can leak.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No uploads, no installation, no build tools&lt;/li&gt;
&lt;li&gt;Works offline — just open the HTML file&lt;/li&gt;
&lt;li&gt;Cross-platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs locally via Web Crypto API, Canvas API, and typed arrays.&lt;/p&gt;




&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Encode:&lt;/strong&gt; Drop any file + two images → get two PNGs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decode:&lt;/strong&gt; Drop the two PNGs → get the original file back. Order doesn't matter.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla JS (ES modules, no frameworks)&lt;/li&gt;
&lt;li&gt;Web Crypto API (AES-256-GCM)&lt;/li&gt;
&lt;li&gt;Canvas / OffscreenCanvas&lt;/li&gt;
&lt;li&gt;pako (zlib compression)&lt;/li&gt;
&lt;li&gt;PNG output only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No frameworks. No build tools. Single HTML + JS.&lt;/p&gt;




&lt;h3&gt;
  
  
  Try It Now
&lt;/h3&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://goodrelax.github.io/gr-tools/grtm2cd/" rel="noopener noreferrer"&gt;https://goodrelax.github.io/gr-tools/grtm2cd/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drop a file and two images — see what happens.&lt;/p&gt;

&lt;p&gt;📂 &lt;strong&gt;&lt;a href="https://github.com/GoodRelax/gr-tools" rel="noopener noreferrer"&gt;https://github.com/GoodRelax/gr-tools&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please use responsibly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Feedback and stars welcome♪  &lt;a href="https://github.com/GoodRelax" rel="noopener noreferrer"&gt;(c) 2026 GoodRelax&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>security</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Symbol for All of Us is Null</title>
      <dc:creator>GoodRelax</dc:creator>
      <pubDate>Sun, 15 Feb 2026 06:21:54 +0000</pubDate>
      <link>https://forem.com/goodrelax/the-symbol-for-all-of-us-is-null-59kn</link>
      <guid>https://forem.com/goodrelax/the-symbol-for-all-of-us-is-null-59kn</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;The Symbol for All of Us is Null&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You might be thinking, "What is this guy even talking about?"&lt;/p&gt;

&lt;p&gt;But if you've found your way to this post, I have a feeling this will click for you somewhere along the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give me five minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There's something humanity does unconsciously to make sense of the world.&lt;/li&gt;
&lt;li&gt;AI does the exact same thing.&lt;/li&gt;
&lt;li&gt;Mathematics describes it beautifully.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And at the end:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why is Null the ultimate symbol for everything?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It all connects in a single thread.&lt;/p&gt;

&lt;p&gt;And once you see that thread, &lt;strong&gt;the world starts to look a little clearer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's walk through it.&lt;/p&gt;




&lt;h2&gt;
  
  
  To Understand Is to Divide
&lt;/h2&gt;

&lt;p&gt;The world is full of things we don't understand.&lt;/p&gt;

&lt;p&gt;But we have a trick for dealing with that: we give different things names and sort them into categories.&lt;/p&gt;

&lt;p&gt;Round fruits? We split them into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apples&lt;/li&gt;
&lt;li&gt;Oranges&lt;/li&gt;
&lt;li&gt;Pears&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and that's how we make sense of them.&lt;/p&gt;

&lt;p&gt;This is the logic of cognition that every one of us runs unconsciously.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Does the Same Thing
&lt;/h2&gt;

&lt;p&gt;AI &lt;strong&gt;understands words as vectors in absurdly high-dimensional space.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What does that even mean? Let's--true to form--&lt;em&gt;divide and understand&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Words:&lt;/strong&gt; assign IDs to things and concepts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Absurdly high-dimensional:&lt;/strong&gt; thousands or even tens of thousands of indices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vectors:&lt;/strong&gt; array-format data you can think of as arrows with direction and magnitude&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understands:&lt;/strong&gt; tidies them up nicely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In pseudocode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apple  = [2, 3, 5, ...]
orange = [3, 5, 7, ...]

dirOfApple = GetDirection(apple)
lenOfApple = GetLength(apple)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;In real LLMs, these vectors live in thousands or even tens of thousands of dimensions.
From a human perspective, the combinations are just… endless.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visually, it looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tb5x9o5624cjnfvpy6v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tb5x9o5624cjnfvpy6v.png" alt="embedding"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is roughly how LLMs like ChatGPT and Gemini work under the hood--it's called &lt;strong&gt;embedding&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For a deeper dive, check out 3Blue1Brown's videos. Absolute masterpieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=wjZofJX0v4M" rel="noopener noreferrer"&gt;Transformers, the tech behind LLMs – Deep Learning Chapter 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Analogy ↔︎ Contrast / Induction ↔︎ Deduction / Concrete ↔︎ Abstract
&lt;/h2&gt;

&lt;p&gt;Most sports and martial arts have fundamental forms. So does the way we see and think about things.&lt;/p&gt;

&lt;p&gt;These three pairs are the basic stances of reasoning. Most people use them without realizing it. But once you name and practice them consciously, you'll understand &lt;em&gt;anything&lt;/em&gt; faster and deeper.&lt;/p&gt;

&lt;pre&gt;
Analogy ↔︎ Contrast :  
      Apples and oranges are both sweet.
                        ↑↓
      Apples are red; oranges are yellow.

Induction ↔︎ Deduction:  
      An apple fell from the tree. There seems to be gravity.
                        ↑↓
      An orange detached from a branch will fall due to gravity.

Concrete ↔︎ Abstract :  
      There's a round, red, sweet apple  
      and a round, yellow, sweet orange.
                        ↑↓
      There are two round fruits.
&lt;/pre&gt;

&lt;p&gt;"Obvious?" Okay, let me explain a bit more carefully.&lt;br&gt;
It's going to get gradually more serious from here.&lt;br&gt;
We'll use some light math, but nothing super rigorous, &lt;br&gt;
so take it easy. Skipping the formulas is totally fine.&lt;/p&gt;


&lt;h3&gt;
  
  
  Analogy and Contrast Are Mappings
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analogy is finding what's the same&lt;/strong&gt;. &lt;br&gt;
&lt;strong&gt;Contrast is finding what's different&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An example:&lt;/p&gt;

&lt;p&gt;An apple is round, red, and sweet.&lt;br&gt;&lt;br&gt;
An orange is round, yellow, and sweet.&lt;/p&gt;

&lt;p&gt;Apply analogy and contrast:&lt;/p&gt;

&lt;pre&gt;
Analogy: a linear transformation toward the same direction  
             → Apples and oranges are both sweet and round  
          
Contrast: a linear transformation toward opposite directions 
             → Apples are red, but oranges are yellow
&lt;/pre&gt;

&lt;p&gt;As a vector diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbzjnd17fg4tpjdzqcjn0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbzjnd17fg4tpjdzqcjn0.png" alt="analogy-and-contrast"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In notation, using linear maps  

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;TanalogyT_{analogy}&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;ana&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
  and  
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;TcontrastT_{contrast}&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;co&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;r&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Analogy:Tanalogy(apple⃗)↑Tanalogy(orange⃗)\text{Analogy} : T_{analogy}(\vec{apple}) \uparrow T_{analogy}(\vec{orange})&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Analogy&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;:&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;ana&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ppl&lt;/span&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;↑&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;ana&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;or&lt;/span&gt;&lt;span class="mord mathnormal"&gt;an&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Contrast:Tcontrast(apple⃗)↓Tcontrast(orange⃗)\text{Contrast} : T_{contrast}(\vec{apple}) \downarrow T_{contrast}(\vec{orange})&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Contrast&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;:&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;co&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;r&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ppl&lt;/span&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;↓&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;co&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;r&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;or&lt;/span&gt;&lt;span class="mord mathnormal"&gt;an&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Induction and Deduction Are Vector Subtraction and Addition
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Induction is searching for laws from specific past observations&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;Deduction is inferring specific future events from laws&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Newton's universal gravitation is the classic example.&lt;/p&gt;

&lt;pre&gt;
Induction:  Extracting a law vector  
  → An apple fell from the tree. There seems to be gravity.

Deduction:  Superposing a law vector  
  → An orange detached from a branch will fall  
     to the ground due to gravity.
&lt;/pre&gt;

&lt;p&gt;As a vector diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1y7n3xlgqu077aneu4q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1y7n3xlgqu077aneu4q.png" alt="induction-and-deduction"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In notation:&lt;br&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Induction:Extraction(fact1⃗,fact2⃗,… )⇒law⃗
\text{Induction}: \quad
\text{Extraction}(\vec{fact_1}, \vec{fact_2}, \dots)
\Rightarrow \vec{law}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Induction&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;:&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Extraction&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="minner"&gt;…&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;⇒&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;




&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;law⃗=facts⃗−∑noise⃗n
\vec{law} = \vec{facts} - \frac{\sum \vec{noise}}{n}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop op-symbol small-op"&gt;∑&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;span class="mord mathnormal"&gt;se&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Deduction:Superposition(object⃗)⇒future⃗
\text{Deduction}: \quad
\text{Superposition}(\vec{object})
\Rightarrow \vec{future}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Deduction&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;:&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Superposition&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;bj&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ec&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;⇒&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mord mathnormal"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal"&gt;re&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;future⃗=object⃗+law⃗
\vec{future} = \vec{object} + \vec{law}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mord mathnormal"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal"&gt;re&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;bj&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ec&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Induction is &lt;em&gt;estimation&lt;/em&gt;.
You stack multiple observations, cancel out the noise, and let the hidden law float to the surface.
&lt;/li&gt;
&lt;li&gt;Deduction is &lt;em&gt;certainty&lt;/em&gt;.
A law applies to the future, no ifs or buts.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Concrete and Abstract Are Information Gain/Loss for Shifting Levels
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;To concretize: is to add parameters (attributes),&lt;br&gt;
gain information, and move down a level of cognition&lt;/strong&gt;*. &lt;br&gt;
 No special rules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;To abstract: is to remove parameters (attributes),&lt;br&gt;
lose information, and move up a level of cognition&lt;/strong&gt;,&lt;br&gt;
 &lt;strong&gt;toward the nice essence.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An apple is round, red, and sweet — that's specific.&lt;br&gt;
A fruit is just something round and edible — that's general.  &lt;/p&gt;

&lt;pre&gt;
Concretize: Add parameters, gain information, move down a level.
  → "fruit" + round + red + sweet = "apple"

Abstract: Remove parameters, lose information, move up a level.
  → "apple" - color - taste = "round thing"
&lt;/pre&gt;

&lt;p&gt;As a diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcd2u14d0avfhfe09hxa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcd2u14d0avfhfe09hxa.png" alt="concretize-and-abstract"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In notation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Concretize(object⃗)⇒object⃗⊕parameters⃗\text{Concretize}(\vec{object}) \Rightarrow \vec{object} \oplus \vec{parameters} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Concretize&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;bj&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ec&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;⇒&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;bj&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ec&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⊕&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;r&lt;/span&gt;&lt;span class="mord mathnormal"&gt;am&lt;/span&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ers&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Abstract(object⃗)⇒object⃗⊖parameters⃗\text{Abstract}(\vec{object}) \Rightarrow \vec{object} \ominus \vec{parameters} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Abstract&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;bj&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ec&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;⇒&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;bj&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ec&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⊖&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;r&lt;/span&gt;&lt;span class="mord mathnormal"&gt;am&lt;/span&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ers&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Take the abstraction "human." Add the parameters "47 years old" and "male,"&lt;br&gt;
and you get "middle-aged dude." 🍺&lt;/p&gt;


&lt;h2&gt;
  
  
  The Nice Essence
&lt;/h2&gt;

&lt;p&gt;When you abstract by stripping away information, doing it haphazardly leads to nonsense.&lt;br&gt;&lt;br&gt;
Remove the stubble and wrinkles from a middle-aged man and you just get a boy.&lt;br&gt;&lt;br&gt;
That's not what we want -- we want to extract the information that actually matters.&lt;/p&gt;

&lt;p&gt;That's where &lt;strong&gt;PCA (Principal Component Analysis)&lt;/strong&gt; comes in.  &lt;/p&gt;

&lt;p&gt;PCA? Sounds fancy? You've probably already experienced it though.&lt;/p&gt;

&lt;p&gt;You know those personality quizzes with ~50 questions&lt;br&gt;&lt;br&gt;
that plot you on a matrix like "Instinctive ↔ Logical" vs. "Extroverted ↔ Introverted"?&lt;br&gt;&lt;br&gt;
Those 50 questions are basically a 50-dimensional vector.&lt;br&gt;&lt;br&gt;
PCA squishes it down to 2 dimensions to make a "personality map."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhq5g3dxl5dhlka893bb6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhq5g3dxl5dhlka893bb6.png" alt="personality_profiling_ja"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In notation:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Extract(data⃗)⇒essence⃗
\text{Extract}(\vec{data}) \Rightarrow \vec{essence}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Extract&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;⇒&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;esse&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ce&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;essence⃗=Z Wk,Wk=[v⃗1,…,v⃗k]whereΣv⃗=λv⃗
\vec{essence} = Z \, W_k, \quad W_k = [\vec{v}_1, \dots, \vec{v}_k] \quad \text{where} \quad \Sigma \vec{v} = \lambda \vec{v}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;esse&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ce&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;Z&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="minner"&gt;…&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;where&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;Σ&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;λ&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="overlay"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;ZZ &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;Z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
: Zero-centering&lt;/li&gt;
&lt;li&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;WW &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;W&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
: Weight matrix&lt;/li&gt;
&lt;li&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;λ\lambda &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
: Eigenvalues = the size of each MECE-organized component of information&lt;/li&gt;
&lt;li&gt;MECE: Mutually Exclusive, Collectively Exhaustive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;k=2k = 2 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;k&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 and you get a 2D matrix.&lt;/p&gt;

&lt;p&gt;This is pretty much the same thing we do unconsciously when we "get the gist" of something.&lt;/p&gt;

&lt;p&gt;For more, this video is excellent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=TgKwz5Ikpc8" rel="noopener noreferrer"&gt;Abstract vector spaces – Chapter 16, Essence of Linear Algebra&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  A Symbol Is a First Principal Component
&lt;/h3&gt;

&lt;p&gt;When we organize information about something, some of it matters more than the rest.&lt;br&gt;&lt;br&gt;
Naturally, we want to pin a simple mark on the most important piece so it sticks.&lt;/p&gt;

&lt;p&gt;That's what &lt;strong&gt;symbols&lt;/strong&gt; are.&lt;/p&gt;

&lt;p&gt;Flags, logos, kings, pop idols…&lt;/p&gt;

&lt;p&gt;When people rally around a symbol, here's what they're actually doing:&lt;br&gt;&lt;br&gt;
from everyone’s messy, sprawling vectors, they converge on the single most important direction.&lt;/p&gt;

&lt;p&gt;That most important vector = PCA's &lt;strong&gt;first principal component&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;PCA extracts the dominant direction of variance.&lt;br&gt;&lt;br&gt;
The first principal component can be interpreted as a &lt;strong&gt;symbol&lt;/strong&gt; capturing shared structure.&lt;br&gt;&lt;br&gt;
The arrow that best represents everyone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffeyrxcez959gdrn7x7o5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffeyrxcez959gdrn7x7o5.png" alt="symbol"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  What's at the End of Abstraction?
&lt;/h3&gt;

&lt;p&gt;Abstraction strips away information toward the &lt;strong&gt;nice essence&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strip a solid down and we get a plane.&lt;/li&gt;
&lt;li&gt;Strip a plane down and we get a line.&lt;/li&gt;
&lt;li&gt;Strip a line down and we get a point.
→ 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;R0\mathbb{R}^0 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 still contains the information "a single point exists."&lt;/li&gt;
&lt;li&gt;Strip even that away, and…?&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;R3→R2→R1→R0=∗→∅=Null
\mathbb{R}^3 \to \mathbb{R}^2 \to \mathbb{R}^1 \to \mathbb{R}^0 = {*} \to \emptyset = \text{Null}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;∗&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;What remains is primordial space, prior to any structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  That Is &lt;strong&gt;Null&lt;/strong&gt;.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zobpk0qb09i1lj2skbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zobpk0qb09i1lj2skbs.png" alt="ultimate-symbol"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, Null means the ultimate absence after abstraction.&lt;/p&gt;

&lt;p&gt;If we keep abstracting everything in the universe, we arrive at &lt;strong&gt;Null&lt;/strong&gt; -- nothingness.&lt;/p&gt;

&lt;p&gt;And so &lt;strong&gt;Null&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Belongs to no one.&lt;/li&gt;
&lt;li&gt;Carries no attributes.&lt;/li&gt;
&lt;li&gt;Is the &lt;strong&gt;ultimate symbol&lt;/strong&gt;, with every vector stripped away.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apples, oranges, you, me — all of us.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strip away the infinite-dimensional noise, and everyone arrives at the same space. That space is &lt;strong&gt;Null.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Primordial space before creation. &lt;em&gt;Form is emptiness.&lt;/em&gt; The Big Bang. They all point to the same thing.&lt;/p&gt;

&lt;h4&gt;
  
  
  Friends who share the same symbol — let’s get along. ♪
&lt;/h4&gt;




&lt;p&gt;(c) 2026 GoodRelax. MIT License.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>math</category>
      <category>poem</category>
      <category>llm</category>
    </item>
    <item>
      <title>The Soul of Software Lives in Its Names - Kotodama</title>
      <dc:creator>GoodRelax</dc:creator>
      <pubDate>Sat, 31 Jan 2026 15:41:48 +0000</pubDate>
      <link>https://forem.com/goodrelax/the-soul-of-software-lives-in-its-names-kotodama-26o6</link>
      <guid>https://forem.com/goodrelax/the-soul-of-software-lives-in-its-names-kotodama-26o6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In mathematics, you can call points “beer mugs” and nothing breaks.&lt;br&gt;
In software, &lt;strong&gt;names&lt;/strong&gt; don’t affect the compiler &lt;br&gt;
— but they change everything for humans and AIs.&lt;br&gt;
In Japan, we have a word for this: &lt;strong&gt;Kotodama&lt;/strong&gt; (言霊).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Soul of Software Lives in Its Names — Kotodama
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kotodama (言霊)&lt;/strong&gt; is an ancient Japanese concept suggesting that words possess spiritual power.&lt;/p&gt;

&lt;p&gt;In modern Japan, the term is rarely discussed in daily life. Most people are not deeply religious; we simply respect traditions and enjoy Christmas, Halloween, and New Year’s shrine visits as cultural rituals.&lt;/p&gt;

&lt;p&gt;So why talk about &lt;em&gt;Kotodama&lt;/em&gt; in software engineering?&lt;/p&gt;

&lt;p&gt;Because this concept isn't about mysticism. It expresses a fundamental truth about how we build systems.&lt;/p&gt;

&lt;p&gt;We have countless principles for great software: &lt;strong&gt;KISS, YAGNI, DRY, SOLID, SoC, SLAP, CQS.&lt;/strong&gt; But beneath all of them lies a single practice that quietly determines the destiny of a codebase:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Naming.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Good naming creates readable code, reduces bugs, and allows software to evolve.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Hilbert Perspective vs. The Human Perspective
&lt;/h3&gt;

&lt;p&gt;The great mathematician David Hilbert once said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It does not matter if we call the things chairs, tables and beer mugs or points, lines and planes."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In mathematics, objects function correctly regardless of their labels, provided the logic and structure are consistent.&lt;/p&gt;

&lt;p&gt;Software is technically the same. A program executes whether you name a class &lt;code&gt;X&lt;/code&gt;, &lt;code&gt;Foo&lt;/code&gt;, or &lt;code&gt;PaymentProcessor&lt;/code&gt;. The compiler does not care.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But humans do.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Poor naming makes code impenetrable. Efficient development relies on a shared mental model. When we read a variable name, we aren't just reading text; we are invoking an idea.&lt;/p&gt;

&lt;p&gt;In this sense: &lt;strong&gt;The soul of software lives in its names.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Kotodama in the Modern Stack
&lt;/h3&gt;

&lt;p&gt;Interestingly, the concept of &lt;em&gt;Kotodama&lt;/em&gt; mirrors this idea perfectly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intent:&lt;/strong&gt; Parents name children with hopes for their future. In code, we name variables to define their purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encapsulation:&lt;/strong&gt; In ancient Japan, people had "true names" (&lt;em&gt;imina&lt;/em&gt; / &lt;em&gt;mana&lt;/em&gt;) that were kept hidden to protect them. This is surprisingly similar to object-oriented programming, where we hide private state behind meaningful abstractions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Words matter. Names carry intent, structure, and understanding.&lt;/p&gt;

&lt;p&gt;That is &lt;strong&gt;Kotodama&lt;/strong&gt; in software.&lt;/p&gt;

&lt;p&gt;Even in the age of AI, names are more important than ever. High-quality prompts with precise naming produce significantly better code. AI doesn't just process logic; it processes the semantics we provide.&lt;/p&gt;

&lt;h3&gt;
  
  
  The GR Naming Cheat Sheet
&lt;/h3&gt;

&lt;p&gt;To help developers harness this power, I created the &lt;strong&gt;GR Naming Cheat Sheet&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://goodrelax.github.io/gr-cheat-sheets/naming/naming_en.html" rel="noopener noreferrer"&gt;English&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goodrelax.github.io/gr-cheat-sheets/naming/naming_ja.html" rel="noopener noreferrer"&gt;Japanese&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you are struggling to find the right name, this table may help you.&lt;br&gt;
I hope this sheet improves your code — and that your software makes everyone, including me, a little happier.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Kotodama" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Kotodama&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Finitary" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Finitary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>cleancode</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>GRSMD — A Privacy-First Markdown Renderer That Runs in Your Browser</title>
      <dc:creator>GoodRelax</dc:creator>
      <pubDate>Sun, 25 Jan 2026 02:45:13 +0000</pubDate>
      <link>https://forem.com/goodrelax/grsmd-a-privacy-first-markdown-renderer-that-runs-in-your-browser-j8o</link>
      <guid>https://forem.com/goodrelax/grsmd-a-privacy-first-markdown-renderer-that-runs-in-your-browser-j8o</guid>
      <description>&lt;h1&gt;
  
  
  This post has been moved
&lt;/h1&gt;

&lt;p&gt;Please check out the latest version here:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/goodrelax" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3730594%2F842c4748-f348-4366-8991-9f9de9400764.png" alt="goodrelax"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/goodrelax/grsmd-instant-markdown-viewer-local-private-4g8c" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;GRSMD: Instant Markdown Viewer — Local &amp;amp; Private&lt;/h2&gt;
      &lt;h3&gt;GoodRelax ・ Mar 1&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#markdown&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#privacy&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>markdown</category>
      <category>plantuml</category>
      <category>mermaid</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
