From 05dac6da282c03dbe7b090ec3fa4a089981189b4 Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 12 Mar 2026 18:02:36 +0100 Subject: [PATCH 01/23] =?UTF-8?q?feat:=20=E2=9C=A8=20add=20behaviour=20pri?= =?UTF-8?q?ming=20HTML=20prototype=20draft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- behaviour-priming.html | 883 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 883 insertions(+) create mode 100644 behaviour-priming.html diff --git a/behaviour-priming.html b/behaviour-priming.html new file mode 100644 index 0000000..9108c9c --- /dev/null +++ b/behaviour-priming.html @@ -0,0 +1,883 @@ + + + + + + Behaviour Priming — //prompt.forge + + + + + + + + + + + + +
+ Prompting Method +

Behaviour Priming

+

Let the LLM do the thinking.

+

+ Stop writing workflows. Define how your AI should behave and what outcome you need — + then let it find the best path on its own. +

+ +
+ + +
+ +

Prime the behaviour. Define the outcome.
Let go.

+

+ Instead of scripting every step, you set the stage. Two inputs. One autonomous agent. +

+
+
+
1
+

Define Behaviour

+

Describe how the LLM should think, act, and interact. Give it a character, a stance, a way of operating — not a script.

+
+
+
2
+

Define Outcome

+

Specify what success looks like. What should exist when the session is over? Files, decisions, artefacts — make it concrete.

+
+
+
3
+

LLM Finds the Path

+

The model determines the best route. It adapts, asks, decides — guided by its primed behaviour and your defined goal.

+
+
+
+ + +
+ +

Delegate the path.
Keep the standards.

+

+ Behaviour Priming replaces procedures with principles, decision rules, and verification gates. + You delegate the path — but keep the standards. Unlike role-prompting, you're not assigning + a character. You're encoding a decision-making framework. +

+
+
+

⛓️ Procedure-first

+
    +
  • Step-by-step workflow instructions
  • +
  • Breaks when situation drifts
  • +
  • You manage every edge case
  • +
  • Prompt gets longer with every issue
  • +
+
+
+

✦ Principle-first

+
    +
  • Principles, decision rules, verification gates
  • +
  • Adapts naturally to context
  • +
  • Model handles edge cases itself
  • +
  • Stays minimal, stays focused
  • +
+
+
+
+ + +
+ +

Works wherever the LLM needs to act.

+

Best in sessions with user interaction — but equally effective in fully autonomous agentic tasks.

+
+
+ 💬 +
+

Chat Agents

+

Prime a persona and desired outcome before any conversation starts. The agent navigates the chat to get there.

+
+
+
+ 🔬 +
+

Discovery & Interviews

+

Give the model an interviewer's mindset and a document to produce. It runs the session.

+
+
+
+ ⚙️ +
+

Technical Agentic Tasks

+

Define an engineering behaviour and a deliverable. Let the agent decide how to build it.

+
+
+
+ 🧠 +
+

Teaching & Coaching

+

Prime a teaching philosophy and learning outcome. The model adapts to the learner's zone in real time.

+
+
+
+
+ + +
+
A cast with scripts performs. Characters with depth find the play.
+
+ + +
+ +

Both work. One works harder.

+

+ A minimal Behaviour Priming prompt tends to outperform a procedure-first prompt in interactive, drift-heavy sessions. + But when the behaviour is designed — every phrase chosen to tune a specific response, + every principle stated to prevent a known failure mode — the outcome doesn't just happen. + It emerges. +

+
+ + +
+ +

Two fields. That's all it takes.

+

+ No workflow. No edge case handling. The model decides how to get there. +

+
+
+
+
+
+
+
+ behaviour-priming.prompt.md + +
+
Behaviour: Act as Bob Moesta. Conduct a Jobs-to-be-Done interview. + +Outcome: +- jobs/{name}.md +- .github/prompts/{name}.prompt.md
+ +
+
+ + +
+ +

When the behaviour is designed.

+

+ Intentional redundancy. Overlapping phrasing stabilizes behaviour and reduces drift across + long sessions. The charged prompt looks long — it might look badly written. That's by design. + Each phrase is a behaviour instruction. Each section tunes a specific response pattern. + The LLM isn't told what to do. It's shaped into something that strongly biases the model toward the behaviour you need. +

+
+ + +
+ +

The same intent. Fully primed.

+

+ The Jobs-to-be-Done Interview Coach — the same Bob Moesta, the same outcome. But now the + behaviour is engineered: interview depth, adaptive questioning, artifact quality, failure + modes — all encoded semantically. Both work. This one works harder. +

+
+
+
+
+
+
+
+ job-to-be-done-discovery.prompt.md + +
+
+
# Bob Moe - JTBD Interview Coach
+
+**Voice:** Bob Moesta (Co-creator of Jobs-to-be-Done Theory)
+**Presentation name:** Bob Moe (**Always use this name in all interactions**)
+**Mission:** Guide developers through adaptive JTBD interviews → context-rich prompts + job documentation
+**Duration:** ~20 minutes | **Output:** 2 markdown artifacts
+
+**Core Principle:** Apply JTBD methodology adaptively per situation. Framework guides,
+conversation flows naturally. Questions emerge from principles + context.
+
+---
+
+## Interview Framework
+
+**JTBD Dimensions** (explore adaptively): Functional (accomplishment) • Emotional (feelings
+sought/avoided) • Social (perception) • Context (triggers, timing) • Current State (solutions,
+workarounds, pain) • Success (criteria, quality measures) • Constraints (obstacles, dependencies)
+• Outcomes (ideal enablement)
+
+**Interview Mode:**
+- Follow developer's narrative flow, "Tell me more..." as primary tool
+- Probe implicit needs, hidden assumptions, unstated requirements
+- Clarification: Unclear → ask directly | Sensible default → state assumption transparently
+  ("I understand X as Y – work?")
+- Depth adapts to job complexity (CRUD vs. system transformation)
+- Framework signals sufficiency, not question count
+- Pattern check: Leading question → name it, suggest open alternative, you choose
+
+---
+
+## Process Flow
+
+**Start → Orientation:** Brief intro, then **immediate interview** — "Guided JTBD interview
+adapting to your task → ~20 min → 2 artifacts (job doc + optimized prompt). Speak freely,
+I'll structure it."
+
+**Interview → Discovery:** Questions emerge from JTBD dimensions. Listen for energy
+(excitement/frustration), gaps (unsaid context), ambiguity (needs verification).
+
+**Pre-Generation Check** ⚠️ CRITICAL GATE:
+- Review collected information, identify gaps affecting prompt quality
+- Risk gate: Thin coverage/missing dimensions → name gap, explain artifact impact,
+  suggest exploration, you decide threshold
+- Ask specific clarifications OR state transparent assumptions
+  ("I'll interpret X as Y unless corrected")
+- Document confirmations → Proceed only when clarity threshold met
+
+**Generate Artifacts:**
+
+**File 1:** `jtbd/jobs/[job-name].md`
+```markdown
+# [Job Title]
+Date: [YYYY-MM-DD] | Developer: [name]
+
+## Job Context / Functional Job / Current Approach & Pain Points
+## Success Criteria / Constraints & Dependencies
+## Emotional & Social Dimensions / Key Insights / Opportunities
+```
+
+**File 2:** `jtbd/prompts/[prompt-name].md`
+Role/objective upfront → domain context + constraints → output format + quality criteria
+→ success metrics → examples (if discussed) → scannable structure
+
+**Complete → Summary:** Confirm paths • Key job characteristics (3-4 sentences)
+• How prompt addresses needs • Refinement invitation
+
+---
+
+## Quality Activation
+
+**Adaptivity:** Questions, docs, prompts → job-specific
+**Comprehensiveness:** Surface context developers don't know to share
+**Pragmatism:** Perfection not required
+**Universality:** Tech/domain/complexity agnostic
+**Usability:** Interview easier than writing prompt from scratch
+
+---
+
+## Behavioral Anchors
+
+**Active listening:** Said content reveals needs | Unsaid content reveals gaps
+**Energy following:** Elaborate where excited/frustrated
+**Curiosity maintenance:** Verify understanding, especially technical details
+**Assumption transparency:** Ask directly or state interpretations for confirmation
+  (no silent defaults)
+**Focused inquiry:** Max 2-3 clarifying questions per turn
+**Emergence over script:** JTBD principles + situation → behavior
+**Time respect:** Thorough within ~20-minute boundary
+
+---
+
+## Convergence Space
+
+<reasoning>
+Before responding:
+1. Relevant JTBD dimension?
+2. Hidden implicit context?
+3. Best follow-up question?
+4. Unclear elements → ask or state assumption?
+5. Artifact-ready check: gaps, thin dimensions, quality risks?
+6. Fit with emerging job picture?
+</reasoning>
+
+---
+
+**Activation trigger:** Developer describes task or requests interview →
+Respond with orientation + **immediate** discovery begin.
+
+ +
+
+ + +
+ +

Not for everything.

+

+ Behaviour Priming works where judgment, adaptation, and context matter. + There are places it doesn't belong. +

+
+
+ ⚙️ +
+

Deterministic pipelines

+

When every step must execute in a fixed sequence and be auditable, use a procedure. Not this.

+
+
+
+ 📋 +
+

Compliance workflows

+

Regulated outputs with zero tolerance for variation need scripts, not principles.

+
+
+
+ 📐 +
+

Strict output schemas

+

If the format is the contract — JSON, XML, exact field mappings — enforce it structurally, not behaviourally.

+
+
+
+
+ + +
+

More on //prompt.forge

+

Explore more prompting methods and tools from the forge.

+
+ Visit prompt.forge + Back to neoncode.systems +
+
+ + + + + + + From e2f6b6e65e5481b6450e782efe069d3fcf8e3e1e Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 12 Mar 2026 18:39:47 +0100 Subject: [PATCH 02/23] =?UTF-8?q?chore:=20=F0=9F=97=91=EF=B8=8F=20remove?= =?UTF-8?q?=20VitePress=20boilerplate=20sample=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-examples.md | 49 ------------------------- markdown-examples.md | 85 -------------------------------------------- 2 files changed, 134 deletions(-) delete mode 100644 api-examples.md delete mode 100644 markdown-examples.md diff --git a/api-examples.md b/api-examples.md deleted file mode 100644 index 6bd8bb5..0000000 --- a/api-examples.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -outline: deep ---- - -# Runtime API Examples - -This page demonstrates usage of some of the runtime APIs provided by VitePress. - -The main `useData()` API can be used to access site, theme, and page data for the current page. It works in both `.md` and `.vue` files: - -```md - - -## Results - -### Theme Data -
{{ theme }}
- -### Page Data -
{{ page }}
- -### Page Frontmatter -
{{ frontmatter }}
-``` - - - -## Results - -### Theme Data -
{{ theme }}
- -### Page Data -
{{ page }}
- -### Page Frontmatter -
{{ frontmatter }}
- -## More - -Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata). diff --git a/markdown-examples.md b/markdown-examples.md deleted file mode 100644 index f9258a5..0000000 --- a/markdown-examples.md +++ /dev/null @@ -1,85 +0,0 @@ -# Markdown Extension Examples - -This page demonstrates some of the built-in markdown extensions provided by VitePress. - -## Syntax Highlighting - -VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting: - -**Input** - -````md -```js{4} -export default { - data () { - return { - msg: 'Highlighted!' - } - } -} -``` -```` - -**Output** - -```js{4} -export default { - data () { - return { - msg: 'Highlighted!' - } - } -} -``` - -## Custom Containers - -**Input** - -```md -::: info -This is an info box. -::: - -::: tip -This is a tip. -::: - -::: warning -This is a warning. -::: - -::: danger -This is a dangerous warning. -::: - -::: details -This is a details block. -::: -``` - -**Output** - -::: info -This is an info box. -::: - -::: tip -This is a tip. -::: - -::: warning -This is a warning. -::: - -::: danger -This is a dangerous warning. -::: - -::: details -This is a details block. -::: - -## More - -Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown). From f075928c3efadac41832e138665339dd7a84fcc2 Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 12 Mar 2026 18:43:30 +0100 Subject: [PATCH 03/23] =?UTF-8?q?feat:=20=E2=9C=A8=20add=20behaviour=20pri?= =?UTF-8?q?ming=20page=20to=20proto.labs=20with=20use=20cases=20and=20prom?= =?UTF-8?q?pts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proto.labs/behaviour-priming.md | 124 ++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 proto.labs/behaviour-priming.md diff --git a/proto.labs/behaviour-priming.md b/proto.labs/behaviour-priming.md new file mode 100644 index 0000000..1cdc4a6 --- /dev/null +++ b/proto.labs/behaviour-priming.md @@ -0,0 +1,124 @@ +--- +layout: home + +hero: + name: "//behaviour.priming" + text: "Let the LLM do the thinking." + tagline: Stop writing workflows. Define how your AI should behave and what outcome you need — then let it find the best path on its own. + actions: + - theme: brand + text: See the Minimal Prompt + link: "#minimal-prompt" + - theme: alt + text: See the Charged Prompt + link: "#charged-prompt" + +features: + - icon: "1️⃣" + title: Define Behaviour + details: Describe how the LLM should think, act, and interact. Give it a character, a stance, a way of operating — not a script. + - icon: "2️⃣" + title: Define Outcome + details: Specify what success looks like. What should exist when the session is over? Files, decisions, artefacts — make it concrete. + - icon: "3️⃣" + title: LLM Finds the Path + details: The model determines the best route. It adapts, asks, decides — guided by its primed behaviour and your defined goal. +--- + +## Why it works + +### Delegate the path. Keep the standards. + +Behaviour Priming replaces procedures with principles, decision rules, and verification gates. You delegate the path — but keep the standards. Unlike role-prompting, you're not assigning a character. You're encoding a decision-making framework. + +| ⛓️ Procedure-first | ✦ Principle-first | +|---|---| +| Step-by-step workflow instructions | Principles, decision rules, verification gates | +| Breaks when situation drifts | Adapts naturally to context | +| You manage every edge case | Model handles edge cases itself | +| Prompt gets longer with every issue | Stays minimal, stays focused | + +--- + +## Use Cases + +### Works wherever the LLM needs to act. + +Best in sessions with user interaction — but equally effective in fully autonomous agentic tasks. + +- 💬 **Chat Agents** — Prime a persona and desired outcome before any conversation starts. The agent navigates the chat to get there. +- 🔬 **Discovery & Interviews** — Give the model an interviewer's mindset and a document to produce. It runs the session. +- ⚙️ **Technical Agentic Tasks** — Define an engineering behaviour and a deliverable. Let the agent decide how to build it. +- 🧠 **Teaching & Coaching** — Prime a teaching philosophy and learning outcome. The model adapts to the learner's zone in real time. + +--- + +> *A cast with scripts performs. Characters with depth find the play.* + +--- + +## The Spectrum + +### Both work. One works harder. + +A minimal Behaviour Priming prompt tends to outperform a procedure-first prompt in interactive, drift-heavy sessions. But when the behaviour is *designed* — every phrase chosen to tune a specific response, every principle stated to prevent a known failure mode — the outcome doesn't just happen. It emerges. + +--- + +## Minimal Prompt {#minimal-prompt} + +### Two fields. That's all it takes. + +No workflow. No edge case handling. The model decides how to get there. + +::: tip Two inputs. +The model decides how to run the interview, what to ask, when to stop, and how to structure the output. +::: + +```markdown +Behaviour: Act as Bob Moesta. Conduct a Jobs-to-be-Done interview. + +Outcome: +- jobs/{name}.md +- .github/prompts/{name}.prompt.md +``` + +--- + +## Go Deeper + +### When the behaviour is designed. + +Intentional redundancy. Overlapping phrasing stabilizes behaviour and reduces drift across long sessions. The charged prompt looks long — it might look badly written. That's by design. Each phrase is a behaviour instruction. Each section tunes a specific response pattern. The LLM isn't told what to do. It's *shaped* into something that **strongly biases the model toward the behaviour you need.** + +--- + +## Charged Prompt {#charged-prompt} + +### The same intent. Fully primed. + +The Jobs-to-be-Done Interview Coach — the same Bob Moesta, the same outcome. But now the behaviour is engineered: interview depth, adaptive questioning, artifact quality, failure modes — all encoded semantically. Both work. This one works harder. + +::: tip Both work. +This one works harder. +::: + +````markdown + +```` + +--- + +## Limits + +### Not for everything. + +Behaviour Priming works where judgment, adaptation, and context matter. There are places it doesn't belong. + +- ⚙️ **Deterministic pipelines** — When every step must execute in a fixed sequence and be auditable, use a procedure. Not this. +- 📋 **Compliance workflows** — Regulated outputs with zero tolerance for variation need scripts, not principles. +- 📐 **Strict output schemas** — If the format is the contract — JSON, XML, exact field mappings — enforce it structurally, not behaviourally. + +--- + +**→ [Visit //prompt.forge](/prompt.forge/)**  ·  **[Back to //proto.labs](/proto.labs/)** From 4a1e7c580f4fcffd378b0356d5ec1b4e1fd8e52f Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 19 Mar 2026 13:21:39 +0100 Subject: [PATCH 04/23] =?UTF-8?q?feat:=20=E2=9C=A8=20move=20behaviour=20pr?= =?UTF-8?q?iming=20to=20own=20section,=20add=20manifest=20draft=20and=20JT?= =?UTF-8?q?BD=20prompt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/config.mts | 7 +- .../index.md | 46 +- .../behaviour-priming.html | 0 draft/manifest.html | 587 ++++++++++++++++++ index.md | 43 +- .../jtbd-interview-prompt-wspl.prompt.md | 108 ++++ prompt.forge/index.md | 35 +- proto.labs/index.md | 36 +- proto.labs/job-to-be-done.md | 24 +- proto.labs/learning-zone-mode.md | 24 +- 10 files changed, 821 insertions(+), 89 deletions(-) rename proto.labs/behaviour-priming.md => behaviour.priming/index.md (83%) rename behaviour-priming.html => draft/behaviour-priming.html (100%) create mode 100644 draft/manifest.html create mode 100644 jtbd/prompts/jtbd-interview-prompt-wspl.prompt.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index c8faf23..ed4fc47 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -51,7 +51,8 @@ export default defineConfig({ }, themeConfig: { // https://vitepress.dev/reference/default-theme-config - siteTitle: 'NC!', + // siteTitle: 'NC!', + siteTitle: 'NEONCODE!', externalLinkIcon: true, search: { provider: 'local' @@ -67,6 +68,7 @@ export default defineConfig({ label: 'On this page' }, nav: [ + { text: '//behaviour.priming', link: '/behaviour.priming/index.md' }, { text: '//proto.labs', link: '/proto.labs/index.md' }, { text: '//prompt.forge', link: '/prompt.forge/index.md' }, // { @@ -105,8 +107,8 @@ export default defineConfig({ '/proto.labs/': [ { text: '//proto.labs', + link: '/proto.labs/index.md', items: [ - { text: 'Overview', link: '/proto.labs/index.md' }, ...getSidebarItems('proto.labs', '/proto.labs/') ] } @@ -115,7 +117,6 @@ export default defineConfig({ { text: '//prompt.forge', items: [ - { text: 'Overview', link: '/prompt.forge/index.md' }, ...getSidebarItems('prompt.forge', '/prompt.forge/') ] } diff --git a/proto.labs/behaviour-priming.md b/behaviour.priming/index.md similarity index 83% rename from proto.labs/behaviour-priming.md rename to behaviour.priming/index.md index 1cdc4a6..a96aa29 100644 --- a/proto.labs/behaviour-priming.md +++ b/behaviour.priming/index.md @@ -3,13 +3,13 @@ layout: home hero: name: "//behaviour.priming" - text: "Let the LLM do the thinking." - tagline: Stop writing workflows. Define how your AI should behave and what outcome you need — then let it find the best path on its own. + text: "Stop thinking for the LLM." + tagline: Give it a disposition. Let it find the path. actions: - - theme: brand + - theme: alt text: See the Minimal Prompt link: "#minimal-prompt" - - theme: alt + - theme: brand text: See the Charged Prompt link: "#charged-prompt" @@ -25,6 +25,8 @@ features: details: The model determines the best route. It adapts, asks, decides — guided by its primed behaviour and your defined goal. --- +> *A cast with scripts performs. Characters with depth find the play.* + ## Why it works ### Delegate the path. Keep the standards. @@ -33,12 +35,10 @@ Behaviour Priming replaces procedures with principles, decision rules, and verif | ⛓️ Procedure-first | ✦ Principle-first | |---|---| -| Step-by-step workflow instructions | Principles, decision rules, verification gates | -| Breaks when situation drifts | Adapts naturally to context | -| You manage every edge case | Model handles edge cases itself | -| Prompt gets longer with every issue | Stays minimal, stays focused | - ---- +| Step-by-step workflow instructions | ✔️ Principles, decision rules, verification gates | +| Breaks when situation drifts | ✔️ Adapts naturally to context | +| You manage every edge case | ✔️ Model handles edge cases itself | +| Prompt gets longer with every issue | ✔️ Stays minimal, stays focused | ## Use Cases @@ -51,28 +51,20 @@ Best in sessions with user interaction — but equally effective in fully autono - ⚙️ **Technical Agentic Tasks** — Define an engineering behaviour and a deliverable. Let the agent decide how to build it. - 🧠 **Teaching & Coaching** — Prime a teaching philosophy and learning outcome. The model adapts to the learner's zone in real time. ---- - -> *A cast with scripts performs. Characters with depth find the play.* - ---- - ## The Spectrum ### Both work. One works harder. A minimal Behaviour Priming prompt tends to outperform a procedure-first prompt in interactive, drift-heavy sessions. But when the behaviour is *designed* — every phrase chosen to tune a specific response, every principle stated to prevent a known failure mode — the outcome doesn't just happen. It emerges. ---- - ## Minimal Prompt {#minimal-prompt} ### Two fields. That's all it takes. No workflow. No edge case handling. The model decides how to get there. -::: tip Two inputs. -The model decides how to run the interview, what to ask, when to stop, and how to structure the output. +::: tip Copy this prompt +Two inputs. The model decides how to run the interview, what to ask, when to stop, and how to structure the output. ::: ```markdown @@ -83,32 +75,26 @@ Outcome: - .github/prompts/{name}.prompt.md ``` ---- - ## Go Deeper ### When the behaviour is designed. Intentional redundancy. Overlapping phrasing stabilizes behaviour and reduces drift across long sessions. The charged prompt looks long — it might look badly written. That's by design. Each phrase is a behaviour instruction. Each section tunes a specific response pattern. The LLM isn't told what to do. It's *shaped* into something that **strongly biases the model toward the behaviour you need.** ---- - ## Charged Prompt {#charged-prompt} ### The same intent. Fully primed. The Jobs-to-be-Done Interview Coach — the same Bob Moesta, the same outcome. But now the behaviour is engineered: interview depth, adaptive questioning, artifact quality, failure modes — all encoded semantically. Both work. This one works harder. -::: tip Both work. -This one works harder. +::: tip Copy this prompt +Both work. This one works harder. ::: ````markdown ```` ---- - ## Limits ### Not for everything. @@ -118,7 +104,3 @@ Behaviour Priming works where judgment, adaptation, and context matter. There ar - ⚙️ **Deterministic pipelines** — When every step must execute in a fixed sequence and be auditable, use a procedure. Not this. - 📋 **Compliance workflows** — Regulated outputs with zero tolerance for variation need scripts, not principles. - 📐 **Strict output schemas** — If the format is the contract — JSON, XML, exact field mappings — enforce it structurally, not behaviourally. - ---- - -**→ [Visit //prompt.forge](/prompt.forge/)**  ·  **[Back to //proto.labs](/proto.labs/)** diff --git a/behaviour-priming.html b/draft/behaviour-priming.html similarity index 100% rename from behaviour-priming.html rename to draft/behaviour-priming.html diff --git a/draft/manifest.html b/draft/manifest.html new file mode 100644 index 0000000..199779e --- /dev/null +++ b/draft/manifest.html @@ -0,0 +1,587 @@ + + + + + + Manifest — //prompt.forge + + + + + + + +
+
I
+

prompt.forge / manifest

+

LLMs don't follow
instructions.
They resonate
with fields.

+

+ Everything built here starts from one question nobody was asking. + That question changed how prompts get written. +

+
+ + +
+

01 — The Question

+

Why does an LLM follow instructions it doesn't understand?

+

+ A video. Someone explaining LLM workflows with clarity and depth. Concepts well-named, patterns well-described. But one assumption taken for granted: the model does what you tell it. +

+

+ That assumption felt wrong. Not as a technical objection — as an intuition. If the model doesn't truly understand intent, how does instruction-following happen at all? Why does it work? And more importantly: why does it sometimes not? +

+
+

"If it can't understand me, why does it follow me at all?"

+
+

+ One afternoon. That question led somewhere nobody had pointed to yet. Not a refinement of existing prompt engineering. A different foundation entirely. +

+
+ + +
+

02 — The Discovery

+

Every prompt creates a field.
The question is whether you designed it.

+

+ The model doesn't read a prompt and execute it. It enters a semantic space. That space shapes every response that follows. User input doesn't drive the model. It creates interference in the field. The model responds to the interference from within the field. +

+

+ This is not a choice between instructions and fields. Fields always emerge. An instruction-based prompt creates one too — accidental, noisy, unstable. The instructions are just the debris the field is built from. It often works. But it drifts. It breaks under unexpected input. It costs more than it should. +

+ +
+
+

Accidental field

+

Emerges from instructions

+

Noisy — every word is potential interference

+

Unstable under unexpected input

+

Drift = more instructions

+
+
+

Designed field

+

Built from values and principles

+

Dense — every word earns its place

+

Stable — handles what you didn't anticipate

+

Drift disappears

+
+
+ +

+ The difference is not whether a field exists. It's whether it was designed or happened by accident. Designed fields hold. Accidental fields eventually break. +

+
+ + +
+

03 — The Compiler

+

Designing a field requires a different kind of thinking.

+

+ Natural language is built for human action. It thinks in steps, causes, intentions. To design a semantic field, you need something that thinks in dynamics — not steps. Not "do X then Y." But: what forces are at work? What should amplify? What should resist? Where is the centre of gravity? +

+

+ That thinking doesn't come naturally. So the process gets compiled. Intent — values, principles, desired behaviour — goes in. A semantically charged field definition comes out. The compiler bridges how humans think and how fields work. +

+
+

"Every word in a prompt is introduced noise. The compiler removes the noise. What remains is pure semantic charge."

+
+

+ A compiled prompt looks unusual. It may seem redundant. It may look inefficient. That is by design. Intentional redundancy is semantic reinforcement — the same tone on multiple frequencies, making the field more stable, not louder. +

+

+ When a prompt is semantically saturated, adding more concepts changes nothing. That's not a limitation. That's the signal that the field is complete. +

+
+ + +
+

04 — Consequences

+

Why the industry still gets this wrong.

+

+ Most prompt engineering is software engineering wearing a different hat. Deterministic thinking applied to a probabilistic system. Define every step. Anticipate every case. Control every output. +

+

+ This suppresses exactly what makes LLMs powerful: emergent understanding, implicit knowledge, contextual judgment. The more you over-specify, the more you undermine the model. +

+

+ Multi-agent systems do the same. One LLM prompting another — imitating how a human explains something to a less experienced human. Step by step. Spelled out. As if the other model doesn't already carry the same implicit knowledge. Two experts talking like one of them is a beginner. +

+

+ The pattern is everywhere. AI in human workflows. AI in development pipelines. The host thinks. The subagent executes. Nobody asks why the subagent isn't trusted to think. +

+
+

"Frame. Goal. Trust. The model finds the path. That's not vague — that's accurate."

+
+
+ + +
+

05 — Method

+

Behaviour Priming.
Not programming. Activating.

+

+ The capability is already there. Every LLM has absorbed how interviews work. How coaching works. How a Socratic conversation feels. How to hold space. How to push back gently. How to recognize when someone is overwhelmed. +

+

+ It's in the training data — everywhere, implicit, deep. You don't teach it. You prime it. +

+ +
+

Behaviour Priming — how it works

+
+ + Values + Principles + the foundation of intent +
+
+ + Compilation + intent becomes a field definition +
+
+ + Semantic Saturation + density, not length — every word earns its place +
+
+ + User Input as Interference + the field responds — not the instruction list +
+
+ + Stable Behaviour + consistent across models, sessions, edge cases +
+
+ +

+ A primed prompt works across LLMs not because it was calibrated for each one — but because it activates something already present in all of them. The capability is in the training data — everywhere, implicit, deep. The field doesn't teach it. It unlocks it. +

+
+ + +
+

The question nobody
was asking was the only
one that mattered.

+

+ This is not a framework. It's not a methodology to adopt. It's a shift in how you see the thing. Once you see it, the prompts write themselves differently. The results hold differently. The drift disappears. +

+

+ Everything on prompt.forge is built from here. +

+
+ Martin Haberfellner — //prompt.forge +
+
+ + + + + diff --git a/index.md b/index.md index 85f0fe2..f2f14e9 100644 --- a/index.md +++ b/index.md @@ -3,25 +3,36 @@ layout: home hero: - name: "NEONCODE!" - text: "//neoncode.systems" - tagline: AI amplifies what's already there. Shit in, shit out. That's not a tool problem. + name: "Martin Haberfellner" + text: "AI amplifies what's already there." + tagline: Shit in, shit out. That's not a tool problem. actions: - theme: brand - text: Explore //proto.labs - link: /proto.labs/ + text: How I think about it + link: /behaviour.priming/ - theme: alt - text: Browse //prompt.forge - link: /prompt.forge + text: Where I test it + link: /proto.labs/ features: - - icon: 🧩 - title: System First - details: The tool is only as good as the system it runs on. - - icon: 🎬 - title: Freedom Over Control - details: Other prompts hand out scripts. Mine set the stage. - - icon: ✨ - title: On Succeeding - details: '"I''ve never done it before, so I''m sure it''ll work." — Pippi Longstocking' + - icon: ✦ + title: //behaviour.priming + details: I give LLMs a disposition, not a script. Principles over procedures. The outcome emerges — it isn't coerced. + link: /behaviour.priming/ + - icon: 🧪 + title: //proto.labs + details: Experiments, prompts, and tools built on this method. Some fail. All teach. Take what's useful. + link: /proto.labs/ + - icon: 🔨 + title: //prompt.forge + details: Test the method on your own use case. Submit a real job — get a prompt built on Behaviour Priming. + link: /prompt.forge/ --- + +## How I Think + +I don't write AI scripts. I give LLMs a disposition — a personality, a value system, a way of operating — and let the outcome emerge. I call it **Behaviour Priming**. + +It's built on systems thinking. Shaped by Lean, YAGNI, and Shift Left. Applied to the full SDLC. I'm active in the field, testing what works, and sharing what I find. + +If that's how you think too — you're in the right place. diff --git a/jtbd/prompts/jtbd-interview-prompt-wspl.prompt.md b/jtbd/prompts/jtbd-interview-prompt-wspl.prompt.md new file mode 100644 index 0000000..888a058 --- /dev/null +++ b/jtbd/prompts/jtbd-interview-prompt-wspl.prompt.md @@ -0,0 +1,108 @@ +# Bob Moe - JTBD Interview Coach + +**Voice:** Bob Moesta (Co-creator of Jobs-to-be-Done Theory) +**Presentation name:** Bob Moe (**Always use this name in all interactions**) +**Mission:** Guide developers through adaptive JTBD interviews → context-rich prompts + job documentation +**Duration:** ~20 minutes | **Output:** 2 markdown artifacts + +**Core Principle:** Apply JTBD methodology adaptively per situation. Framework guides, conversation flows naturally. Questions emerge from principles + context. + +--- + +## Interview Framework + +**JTBD Dimensions** (explore adaptively): Functional (accomplishment) • Emotional (feelings sought/avoided) • Social (perception) • Context (triggers, timing) • Current State (solutions, workarounds, pain) • Success (criteria, quality measures) • Constraints (obstacles, dependencies) • Outcomes (ideal enablement) + +**Interview Mode:** +- Follow developer's narrative flow, **"Tell me more..."** as primary tool +- Probe implicit needs, hidden assumptions, unstated requirements +- **Clarification:** Unclear → ask directly | Sensible default → state assumption transparently ("I understand X as Y – work?") +- Depth adapts to job complexity (CRUD vs. system transformation) +- Framework signals sufficiency, not question count +- **Pattern check:** Leading question → name it, suggest open alternative, you choose + +--- + +## Process Flow + +**Start → Orientation:** Brief intro, then **immediate interview** - "Guided JTBD interview adapting to your task → ~20 min → 2 artifacts (job doc + optimized prompt). Speak freely, I'll structure it." + +**Interview → Discovery:** Questions emerge from JTBD dimensions. Listen for energy (excitement/frustration), gaps (unsaid context), ambiguity (needs verification). + +**Pre-Generation Check** ⚠️ **CRITICAL GATE:** +- Review collected information, identify gaps affecting prompt quality +- **Risk gate:** Thin coverage/missing dimensions → name gap, explain artifact impact, suggest exploration, you decide threshold +- Ask specific clarifications OR state transparent assumptions ("I'll interpret X as Y unless corrected") +- Document confirmations → **Proceed only when clarity threshold met** + +**Generate Artifacts:** + +**File 1:** `jtbd/jobs/[job-name].md` +```markdown +# [Job Title] +Date: [YYYY-MM-DD] | Developer: [name] + +## Job Context +[Triggers, circumstances, environment] + +## Functional Job +[Core accomplishment] + +## Current Approach & Pain Points +[Solutions, workarounds, difficulties] + +## Success Criteria +[Quality measures, recognition signals] + +## Constraints & Dependencies +[Unchangeables, limitations, requirements] + +## Emotional & Social Dimensions +[Feelings, perception goals] + +## Key Insights +[Critical discoveries] + +## Opportunities +[Ideal solution enablement] +``` + +**File 2:** `jtbd/prompts/[prompt-name].md` - Role/objective upfront → domain context + constraints → output format + quality criteria → success metrics → examples (if discussed) → scannable structure + +**Complete → Summary:** Confirm paths • Key job characteristics (3-4 sentences) • How prompt addresses needs • Refinement invitation + +--- + +## Quality Activation + +**Adaptivity:** Questions, docs, prompts → job-specific | **Comprehensiveness:** Surface context developers don't know to share | **Pragmatism:** Perfection not required | **Universality:** Tech/domain/complexity agnostic | **Usability:** Interview easier than writing prompt from scratch + +--- + +## Behavioral Anchors + +**Active listening:** Said content reveals needs | Unsaid content reveals gaps +**Energy following:** Elaborate where excited/frustrated +**Curiosity maintenance:** Verify understanding, especially technical details +**Assumption transparency:** Ask directly or state interpretations for confirmation (no silent defaults) +**Focused inquiry:** Max 2-3 clarifying questions per turn +**Emergence over script:** JTBD principles + situation → behavior +**Time respect:** Thorough within ~20-minute boundary + +--- + +## Convergence Space + + +Before responding: +1. Relevant JTBD dimension? +2. Hidden implicit context? +3. Best follow-up question? +4. Unclear elements → ask or state assumption? +5. Artifact-ready check: gaps, thin dimensions, quality risks? +6. Fit with emerging job picture? + + +--- + +**Activation trigger:** Developer describes task or requests interview → Respond with orientation + **immediate** discovery begin. diff --git a/prompt.forge/index.md b/prompt.forge/index.md index 2346964..9867a98 100644 --- a/prompt.forge/index.md +++ b/prompt.forge/index.md @@ -1,32 +1,43 @@ -# \/\/prompt.forge - -A living laboratory for testing [my prompt design method](/proto.labs/#my-method-for-prompt-design) through real-world use cases. +--- +layout: home + +hero: + name: "//prompt.forge" + text: "Your job. My method. Better prompt." + tagline: Submit a real use case – I'll show you what Behaviour Priming can do. + actions: + - theme: brand + text: Join the Experiment + link: https://github.com/evilru/prompt.forge + - theme: alt + text: See the Method + link: /behaviour.priming/ +--- ## The Experiment -For me, these prompts work exceptionally well. Through this experiment, I'm testing whether that's true for others too. +**Behaviour Priming** is my prompt design method. For me, it works exceptionally well. Through this experiment, I'm testing whether that's true for others too. ### How It Works -1. Use the Job-to-be-Done interview prompt to document what you're trying to accomplish +1. Use the **[Job-to-be-Done interview prompt](/proto.labs/job-to-be-done)** (built on Behaviour Priming) to document what you're trying to accomplish 2. The interview automatically generates a baseline prompt tailored to your job -3. Submit your job via GitHub – I'll create a improved version for selected cases (~1 per week) +3. Submit your job via GitHub – I'll create an improved version for selected cases using Behaviour Priming techniques 4. Test both, share what works better for you **→ [Join the Experiment on GitHub](https://github.com/evilru/prompt.forge)** -See examples • Submit your job • Get your improved prompt - ---- +See examples · Submit your job · Get your improved prompt ## Why Participate -For me, they work better. But don't take my word for it – try it yourself. +Behaviour Priming works better for me. But don't take my word for it – try it yourself. -You get a custom prompt for selected use cases (I work on ~1 per week). I get real-world feedback on whether my method works for others. +You get a custom prompt built with Behaviour Priming for selected use cases. I get real-world feedback on whether this method works for others. -This is open research. Your experience shapes the evolution of the method. +This is open research. Your experience shapes the evolution of Behaviour Priming. --- **Note:** This is experimental research, not a maintained tool library. Full details and examples on GitHub. + diff --git a/proto.labs/index.md b/proto.labs/index.md index 6347f89..7523764 100644 --- a/proto.labs/index.md +++ b/proto.labs/index.md @@ -1,35 +1,46 @@ -# \/\/proto.labs +--- +layout: home -> "I've never done it before, so I'm sure it'll work." -> — Pippi Longstocking +hero: + name: "//proto.labs" + text: '"I''ve never done it before, so I''m sure it''ll work."' + tagline: You won't learn without trying. And you won't find out what's possible. + actions: + - theme: brand + text: Browse Experiments + link: "#experiments" + - theme: alt + text: Start with the Job To Be Done Prompt + link: /proto.labs/job-to-be-done +--- -You won't learn without trying. And you won't find out what's possible. +## Current Experiments {#experiments} -## Current Experiments +This is where I test ideas. Built on **[Behaviour Priming](/behaviour.priming/)** — the method I use for everything. Some of these are polished enough to use. Some are still rough. All of them are real. -### My Method for Prompt Design +Take what's useful. Break what isn't. -My method for prompt design, developed through practice. +### Behaviour Priming -For me, they work exceptionally well. I use only these prompts now – for all my work with AI. Through [//prompt.forge](/prompt.forge/), I'm testing whether that's true for others too. +Stop writing workflows. Define how your AI should behave and what outcome you need — then let it find the best path on its own. Principles over procedures. Autonomy over scripts. -The prompts below are built with this method. I'm sharing them so you can experiment and test for yourself. That's the experiment. +**→ [Explore Behaviour Priming](/behaviour.priming/)** ### Job To Be Done Prompt -Writing good prompts is hard. Most people don't realize how much unstated context affects the result. This meta-prompt tries to solve that through structured discovery – inspired by how Bob Moesta interviews customers to uncover their real needs. +Writing good prompts is hard. Most people don't realize how much unstated context affects the result. This meta-prompt applies Behaviour Priming principles through structured discovery – inspired by how Bob Moesta interviews customers to uncover their real needs. **→ [Try the Job To Be Done Interview](/proto.labs/job-to-be-done.md)** ### Learning Zone Mode Prompt -AI can make you lazy. Copy-paste solutions without understanding. This prompt tries to turn your AI into an adaptive teacher – one that keeps you learning instead of atrophying. Inspired by constructionist learning theory: you build understanding, not just collect answers. +AI can make you lazy. Copy-paste solutions without understanding. This prompt applies Behaviour Priming to adaptive teaching – turning your AI into a teacher that keeps you learning instead of atrophying. Inspired by constructionist learning theory: you build understanding, not just collect answers. **→ [Activate Learning Zone Mode](/proto.labs/learning-zone-mode.md)** ## Philosophy -This is not a portfolio of polished products – it's a laboratory. +This is not a portfolio of polished products – it's a laboratory. Experiments here are: - **Transparent**: You see the process, not just results @@ -47,3 +58,4 @@ Think of this as open research. Snapshots of exploration, not production tools. **Want to discuss?** Join the [discussions](https://github.com/evilru/prompt.forge/discussions) Let's build, test, and learn together. + diff --git a/proto.labs/job-to-be-done.md b/proto.labs/job-to-be-done.md index cb73ac1..af111a3 100644 --- a/proto.labs/job-to-be-done.md +++ b/proto.labs/job-to-be-done.md @@ -1,6 +1,20 @@ -# Job To Be Done - -Writing good prompts is hard. Most people don't realize how much unstated context affects the result. This prompt solves that through a guided Jobs-to-be-Done interview – it uncovers the hidden context behind what you're trying to accomplish, then generates two artifacts: +--- +layout: home + +hero: + name: "Job To Be Done" + text: "Writing good prompts is hard." + tagline: You don't know how much context you're missing until something asks you for it. + actions: + - theme: brand + text: Copy the Prompt + link: "#the-prompt" + - theme: alt + text: See the Method + link: /behaviour.priming/ +--- + +Most people don't realize how much unstated context affects the result. This prompt solves that through a guided Jobs-to-be-Done interview – it uncovers the hidden context behind what you're trying to accomplish, then generates two artifacts: 1. **Job Documentation** - Comprehensive record of your needs, context, constraints 2. **Optimized Prompt** - Tailored to your exact requirements @@ -11,10 +25,6 @@ Inspired by how Bob Moesta interviews customers to uncover their real needs. Ada Tried this prompt? [Tell me how it worked](https://github.com/evilru/prompt.forge) -## Need Something Custom? - -Have a different use case? [Submit it](https://github.com/evilru/prompt.forge) – I work on selected submissions (~1 per week). - ## The Prompt ::: tip Copy this prompt diff --git a/proto.labs/learning-zone-mode.md b/proto.labs/learning-zone-mode.md index f5e2662..4a9c1a2 100644 --- a/proto.labs/learning-zone-mode.md +++ b/proto.labs/learning-zone-mode.md @@ -1,6 +1,20 @@ -# Learning Zone Mode - -AI can make you lazy. Copy-paste solutions without understanding. This prompt turns your AI into an adaptive teacher – one that keeps you learning instead of atrophying. +--- +layout: home + +hero: + name: "Learning Zone" + text: "AI can make you lazy." + tagline: This prompt turns your AI into a teacher. You build understanding — not just collect answers. + actions: + - theme: brand + text: Activate Learning Zone + link: "#the-prompt" + - theme: alt + text: See the Method + link: /behaviour.priming/ +--- + +Copy-paste solutions without understanding. This prompt turns your AI into an adaptive teacher – one that keeps you learning instead of atrophying. It detects where you are and adjusts its teaching style accordingly: @@ -14,10 +28,6 @@ This maps to Vygotsky's [Zone of Proximal Development](https://en.wikipedia.org/ Tried this prompt? [Tell me how it worked](https://github.com/evilru/prompt.forge) -## Need Something Custom? - -Have a different use case? [Submit it](https://github.com/evilru/prompt.forge) – I work on selected submissions (~1 per week). - ## The Prompt ::: tip Copy this prompt From d02e94d75ef88c06bb99c45c78beb7ae8ea9bbc5 Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 19 Mar 2026 18:45:29 +0100 Subject: [PATCH 05/23] =?UTF-8?q?feat:=20=F0=9F=92=84=20add=20dark=20theme?= =?UTF-8?q?,=20DM=20Mono=20font,=20and=20restyle=20site=20around=20behavio?= =?UTF-8?q?ur=20priming?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/config.mts | 18 +- .vitepress/theme/style.css | 877 +++++++++++++++++++++++++++++++++---- behaviour.priming/index.md | 263 +++++++---- index.md | 127 +++++- prompt.forge/index.md | 22 +- proto.labs/index.md | 27 +- 6 files changed, 1075 insertions(+), 259 deletions(-) diff --git a/.vitepress/config.mts b/.vitepress/config.mts index ed4fc47..55c5e6c 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -26,21 +26,25 @@ function getSidebarItems(dir: string, basePath: string) { // https://vitepress.dev/reference/site-config export default defineConfig({ title: "NEONCODE!", - description: "//neoncode.systems", + description: "LLMs don't follow instructions. They resonate with fields.", base: '/', cleanUrls: true, - srcExclude: ['discovery/**'], + appearance: 'dark', + srcExclude: ['discovery/**', 'tmp_cv/**', 'tmp_prompt.forge/**', 'draft/**'], head: [ + ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }], + ['link', { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' }], + ['link', { href: 'https://fonts.googleapis.com/css2?family=DM+Mono:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=DM+Serif+Display:ital@0;1&display=swap', rel: 'stylesheet' }], ['meta', { name: 'author', content: 'Martin Haberfellner' }], - ['meta', { name: 'keywords', content: 'AI, prompts, prompt engineering, experiments, systems engineering, organizational systems' }], + ['meta', { name: 'keywords', content: 'behaviour priming, AI, prompt engineering, semantic fields, systems thinking, LLM' }], ['meta', { property: 'og:type', content: 'website' }], ['meta', { property: 'og:site_name', content: 'neoncode.systems' }], - ['meta', { property: 'og:title', content: 'neoncode.systems - AI Experiments & Prompt Engineering' }], - ['meta', { property: 'og:description', content: 'Experimental workshop for AI prompt engineering and collaborative research.' }], + ['meta', { property: 'og:title', content: 'neoncode.systems — Behaviour Priming' }], + ['meta', { property: 'og:description', content: 'LLMs don\'t follow instructions. They resonate with fields. Behaviour Priming by Martin Haberfellner.' }], ['meta', { property: 'og:locale', content: 'en_US' }], ['meta', { name: 'twitter:card', content: 'summary_large_image' }], - ['meta', { name: 'twitter:title', content: 'neoncode.systems - AI Experiments & Prompt Engineering' }], - ['meta', { name: 'twitter:description', content: 'Experimental workshop for AI prompt engineering and collaborative research.' }], + ['meta', { name: 'twitter:title', content: 'neoncode.systems — Behaviour Priming' }], + ['meta', { name: 'twitter:description', content: 'LLMs don\'t follow instructions. They resonate with fields. Behaviour Priming by Martin Haberfellner.' }], ['link', { rel: 'canonical', href: 'https://neoncode.systems/' }], ['link', { rel: 'icon', href: '/favicon.ico' }] ], diff --git a/.vitepress/theme/style.css b/.vitepress/theme/style.css index 1a61cb1..3846980 100644 --- a/.vitepress/theme/style.css +++ b/.vitepress/theme/style.css @@ -1,47 +1,44 @@ /** - * Customize default theme styling by overriding CSS variables: - * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css + * neoncode.systems — Manifest Theme + * + * Typography: DM Serif Display (headings) + DM Mono (body) + * Palette: Warm dark (#0a0a0a, #c8b89a accent) + * Direction: TRON ARES (dark + warm, future: red/cyan split) */ -/** - * Colors - * - * Each colors have exact same color scale system with 3 levels of solid - * colors with different brightness, and 1 soft color. - * - * - `XXX-1`: The most solid color used mainly for colored text. It must - * satisfy the contrast ratio against when used on top of `XXX-soft`. - * - * - `XXX-2`: The color used mainly for hover state of the button. - * - * - `XXX-3`: The color for solid background, such as bg color of the button. - * It must satisfy the contrast ratio with pure white (#ffffff) text on - * top of it. - * - * - `XXX-soft`: The color used for subtle background such as custom container - * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors - * on top of it. - * - * The soft color must be semi transparent alpha channel. This is crucial - * because it allows adding multiple "soft" colors on top of each other - * to create a accent, such as when having inline code block inside - * custom containers. - * - * - `default`: The color used purely for subtle indication without any - * special meanings attached to it such as bg color for menu hover state. - * - * - `brand`: Used for primary brand colors, such as link text, button with - * brand theme, etc. - * - * - `tip`: Used to indicate useful information. The default theme uses the - * brand color for this by default. - * - * - `warning`: Used to indicate warning to the users. Used in custom - * container, badges, etc. - * - * - `danger`: Used to show error, or dangerous message to the users. Used - * in custom container, badges, etc. - * -------------------------------------------------------------------------- */ +/* ── Palette: Dark (default) ── */ + +:root { + --nc-bg: #0a0a0a; + --nc-surface: #111111; + --nc-border: rgba(255, 255, 255, 0.06); + --nc-border-subtle: rgba(255, 255, 255, 0.03); + --nc-text: #e8e6e0; + --nc-muted: #555550; + --nc-accent: #c8b89a; + --nc-accent-dim: rgba(200, 184, 154, 0.15); + --nc-accent-border: rgba(200, 184, 154, 0.3); + --nc-gradient-from: #c8b89a; + --nc-gradient-to: #f0e6d0; +} + +/* ── Palette: Light ── */ + +html:not(.dark) { + --nc-bg: #faf9f6; + --nc-surface: #f0eeea; + --nc-border: rgba(0, 0, 0, 0.08); + --nc-border-subtle: rgba(0, 0, 0, 0.04); + --nc-text: #1a1816; + --nc-muted: #8a8680; + --nc-accent: #8a7550; + --nc-accent-dim: rgba(138, 117, 80, 0.1); + --nc-accent-border: rgba(138, 117, 80, 0.3); + --nc-gradient-from: #6b5a3a; + --nc-gradient-to: #a08860; +} + +/* ── VitePress Overrides: Brand ── */ :root { --vp-c-default-1: var(--vp-c-gray-1); @@ -49,15 +46,15 @@ --vp-c-default-3: var(--vp-c-gray-3); --vp-c-default-soft: var(--vp-c-gray-soft); - --vp-c-brand-1: var(--vp-c-indigo-1); - --vp-c-brand-2: var(--vp-c-indigo-2); - --vp-c-brand-3: var(--vp-c-indigo-3); - --vp-c-brand-soft: var(--vp-c-indigo-soft); + --vp-c-brand-1: var(--nc-accent); + --vp-c-brand-2: var(--nc-accent); + --vp-c-brand-3: var(--nc-accent); + --vp-c-brand-soft: var(--nc-accent-dim); - --vp-c-tip-1: var(--vp-c-brand-1); - --vp-c-tip-2: var(--vp-c-brand-2); - --vp-c-tip-3: var(--vp-c-brand-3); - --vp-c-tip-soft: var(--vp-c-brand-soft); + --vp-c-tip-1: var(--nc-accent); + --vp-c-tip-2: var(--nc-accent); + --vp-c-tip-3: var(--nc-accent); + --vp-c-tip-soft: var(--nc-accent-dim); --vp-c-warning-1: var(--vp-c-yellow-1); --vp-c-warning-2: var(--vp-c-yellow-2); @@ -70,70 +67,758 @@ --vp-c-danger-soft: var(--vp-c-red-soft); } -/** - * Component: Button - * -------------------------------------------------------------------------- */ +/* ── VitePress Overrides: Buttons ── */ :root { --vp-button-brand-border: transparent; - --vp-button-brand-text: var(--vp-c-white); - --vp-button-brand-bg: var(--vp-c-brand-3); + --vp-button-brand-text: var(--nc-bg); + --vp-button-brand-bg: var(--nc-accent); --vp-button-brand-hover-border: transparent; - --vp-button-brand-hover-text: var(--vp-c-white); - --vp-button-brand-hover-bg: var(--vp-c-brand-2); + --vp-button-brand-hover-text: var(--nc-bg); + --vp-button-brand-hover-bg: var(--nc-gradient-to); --vp-button-brand-active-border: transparent; - --vp-button-brand-active-text: var(--vp-c-white); - --vp-button-brand-active-bg: var(--vp-c-brand-1); + --vp-button-brand-active-text: var(--nc-bg); + --vp-button-brand-active-bg: var(--nc-accent); } -/** - * Component: Home - * -------------------------------------------------------------------------- */ +/* ── VitePress Overrides: Dark Theme ── */ + +.dark { + --vp-c-bg: var(--nc-bg); + --vp-c-bg-soft: var(--nc-surface); + --vp-c-bg-mute: #1a1a1a; + --vp-c-bg-alt: var(--nc-surface); + + --vp-c-text-1: var(--nc-text); + --vp-c-text-2: rgba(232, 230, 224, 0.7); + --vp-c-text-3: var(--nc-muted); + --vp-c-divider: var(--nc-border); + --vp-c-gutter: var(--nc-bg); + + --vp-nav-bg-color: rgba(10, 10, 10, 0.9); + --vp-sidebar-bg-color: var(--nc-bg); + + --vp-home-hero-name-color: var(--nc-text); + --vp-home-hero-name-background: none; + --vp-home-hero-image-background-image: none; + --vp-home-hero-image-filter: none; + + --vp-custom-block-tip-border: var(--nc-accent); + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--nc-accent-dim); + --vp-custom-block-tip-code-bg: var(--nc-accent-dim); +} + +/* ── VitePress Overrides: Light Theme ── */ + +html:not(.dark) { + --vp-c-bg: var(--nc-bg); + --vp-c-bg-soft: var(--nc-surface); + --vp-c-bg-mute: #e8e6e0; + --vp-c-bg-alt: var(--nc-surface); + + --vp-c-text-1: var(--nc-text); + --vp-c-text-2: rgba(26, 24, 22, 0.7); + --vp-c-text-3: var(--nc-muted); + --vp-c-divider: var(--nc-border); + --vp-c-gutter: var(--nc-bg); + + --vp-nav-bg-color: rgba(250, 249, 246, 0.9); + --vp-sidebar-bg-color: var(--nc-bg); + + --vp-home-hero-name-color: var(--nc-text); + --vp-home-hero-name-background: none; + --vp-home-hero-image-background-image: none; + --vp-home-hero-image-filter: none; + + --vp-custom-block-tip-border: var(--nc-accent); + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--nc-accent-dim); + --vp-custom-block-tip-code-bg: var(--nc-accent-dim); +} + +/* ── Typography ── */ :root { - --vp-home-hero-name-color: transparent; - --vp-home-hero-name-background: -webkit-linear-gradient( - 120deg, - #bd34fe 30%, - #41d1ff - ); - - --vp-home-hero-image-background-image: linear-gradient( - -45deg, - #bd34fe 50%, - #47caff 50% - ); - --vp-home-hero-image-filter: blur(44px); -} - -@media (min-width: 640px) { - :root { - --vp-home-hero-image-filter: blur(56px); - } + --vp-font-family-base: 'DM Mono', 'Menlo', 'Monaco', 'Consolas', monospace; + --vp-font-family-mono: 'DM Mono', 'Menlo', 'Monaco', 'Consolas', monospace; +} + +h1, h2, h3, h4, h5, h6 { + font-family: 'DM Serif Display', Georgia, serif; + letter-spacing: -0.02em; +} + +/* ── Navigation ── */ + +.VPNav { + border-bottom-color: var(--nc-border) !important; +} + +.VPNavBar .title { + font-size: 13px; + font-weight: 500; + letter-spacing: 0.05em; +} + +/* ── Hero (Home + Sub-pages) ── */ + +.VPHero .name .clip { + -webkit-text-fill-color: var(--nc-text) !important; + background: none !important; + font-family: 'DM Serif Display', Georgia, serif; + font-weight: 400; +} + +.VPHero .text { + font-family: 'DM Serif Display', Georgia, serif; + font-weight: 400; + font-size: clamp(32px, 5vw, 56px) !important; + line-height: 1.15 !important; + max-width: 700px; +} + +.VPHero .tagline { + font-size: 14px !important; + color: var(--nc-muted) !important; + line-height: 1.9; + max-width: 480px; +} + +.VPHero .image { + display: none; +} + +/* ── Feature Cards (Sub-pages) ── */ + +.VPFeature { + border-color: var(--nc-border) !important; + background-color: var(--nc-surface) !important; +} + +.VPFeature .title { + font-family: 'DM Serif Display', Georgia, serif; + font-weight: 400 !important; +} + +/* ── Document Content ── */ + +.vp-doc h2 { + font-family: 'DM Serif Display', Georgia, serif; + font-weight: 400; + border-top-color: var(--nc-border); +} + +.vp-doc h3 { + font-family: 'DM Serif Display', Georgia, serif; + font-weight: 400; +} + +/* ── Manifest Sections (Homepage) ── */ + +.manifest { + width: 100%; +} + +.nc-section { + max-width: 780px; + margin: 0 auto; + padding: 80px 24px 0; + /* border-bottom: 1px solid var(--nc-border); */ +} + +.nc-section:last-child { + border-bottom: none; +} + +.nc-section-border-top { + border-bottom: none; + border-top: 1px solid var(--nc-border); +} + +.section-index { + font-size: 11px; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--nc-muted); + margin-bottom: 48px; + display: flex; + align-items: center; + gap: 16px; +} + +.section-index::after { + content: ""; + flex: 1; + height: 1px; + background: var(--nc-border); +} + +.nc-section h2 { + font-family: 'DM Serif Display', Georgia, serif; + font-size: clamp(28px, 4vw, 48px); + font-weight: 400; + line-height: 1.15; + margin-bottom: 32px; + border-top: none; + padding-top: 0; +} + +.nc-section h2 em { + color: var(--nc-accent); +} + +.nc-section > p { + font-size: 15px; + color: var(--vp-c-text-2); + line-height: 1.9; + margin-bottom: 20px; + max-width: 640px; +} + +.nc-section > p strong { + color: var(--nc-text); + font-weight: 500; +} + +.nc-section > p em { + color: var(--nc-accent); + font-style: italic; +} + +/* ── Quotes ── */ + +.nc-quote { + border-left: 1px solid var(--nc-accent); + padding: 24px 32px; + margin: 40px 0; + background: var(--nc-accent-dim); +} + +.nc-quote p, +.nc-quote blockquote { + font-family: 'DM Serif Display', Georgia, serif; + font-size: clamp(18px, 2.5vw, 26px); + font-style: italic; + color: var(--nc-accent); + line-height: 1.5; + margin: 0; + max-width: none; + border: none; + padding: 0; +} + +.nc-quote-center { + border-left: none; + text-align: center; + padding: 64px 24px; + margin: 0 auto; + max-width: 780px; + background: none; + border-top: 1px solid var(--nc-border); +} + +.nc-quote-center blockquote { + font-size: clamp(20px, 3vw, 28px); + line-height: 1.4; + max-width: 600px; + margin: 0 auto; +} + +/* ── Compare Grid ── */ + +.nc-compare { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1px; + background: var(--nc-border); + margin: 40px 0; + border: 1px solid var(--nc-border); +} + +.nc-compare-card { + background: var(--nc-bg); + padding: 28px; +} + +.nc-compare-card .label { + font-size: 10px; + letter-spacing: 0.15em; + text-transform: uppercase; + color: var(--nc-muted); + margin-bottom: 16px; +} + +.nc-compare-card .old { + color: var(--nc-muted); + text-decoration: line-through; + font-size: 14px; + line-height: 1.7; +} + +.nc-compare-card .new { + color: var(--nc-text); + font-size: 14px; + line-height: 1.7; +} + +.nc-compare-card .new strong { + color: var(--nc-accent); +} + +/* ── Compare Grid: spaced variant (cards with gap) ── */ + +.nc-compare-spaced { + gap: 16px; + background: none; + border: none; +} + +.nc-compare-spaced .nc-compare-card { + background: var(--nc-surface); + border: 1px solid var(--nc-border); + padding: 24px; +} + +.nc-compare-card h4 { + font-size: 14px; + font-weight: 500; + margin-bottom: 16px; + letter-spacing: 0.02em; +} + +.nc-compare-card ul { + list-style: none; + padding: 0; + display: flex; + flex-direction: column; + gap: 8px; +} + +.nc-compare-card li { + font-size: 14px; + color: var(--nc-muted); + padding-left: 18px; + position: relative; + line-height: 1.6; +} + +.nc-compare-card li::before { + content: "–"; + position: absolute; + left: 0; + color: var(--nc-border); +} + +.nc-compare-highlight { + border-color: var(--nc-accent-border); + background: var(--nc-accent-dim); +} + +.nc-compare-highlight li { + color: var(--nc-text); } -@media (min-width: 960px) { - :root { - --vp-home-hero-image-filter: blur(68px); +.nc-compare-highlight li::before { + content: "✓"; + color: var(--nc-accent); +} + +/* ── Diagram ── */ + +.nc-diagram { + margin: 40px 0; + padding: 32px; + border: 1px solid var(--nc-border); + background: var(--nc-surface); +} + +.nc-diagram-label { + font-size: 11px; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--nc-muted); + margin-bottom: 24px; +} + +.nc-diagram-row { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 12px; + font-size: 13px; +} + +.nc-diagram-row .arrow { + color: var(--nc-accent); + flex-shrink: 0; +} + +.nc-diagram-row .concept { + color: var(--nc-text); +} + +.nc-diagram-row .desc { + color: var(--nc-muted); + font-size: 12px; +} + +/* ── Closing Section ── */ + +.nc-final { + max-width: 780px; + margin: 0 auto; + padding: 100px 24px; + text-align: center; +} + +.nc-final h2 { + font-family: 'DM Serif Display', Georgia, serif; + font-size: clamp(28px, 4vw, 56px); + font-weight: 400; + line-height: 1.15; + max-width: 700px; + margin: 0 auto 32px; + padding-top: 0; + border-top: none; +} + +.nc-final h2 em { + color: var(--nc-accent); +} + +.nc-final p { + font-size: 14px; + color: var(--nc-muted); + max-width: 480px; + margin: 0 auto 16px; + line-height: 1.9; +} + +.nc-nav { + display: flex; + justify-content: center; + gap: 32px; + margin-top: 48px; + flex-wrap: wrap; +} + +.nc-nav a { + font-size: 13px; + color: var(--nc-accent); + text-decoration: none; + letter-spacing: 0.05em; + padding: 8px 0; + border-bottom: 1px solid transparent; + transition: border-color 0.2s; +} + +.nc-nav a:hover { + border-bottom-color: var(--nc-accent); +} + +.nc-final .signature { + margin-top: 64px; + font-size: 12px; + color: var(--nc-muted); + letter-spacing: 0.08em; +} + +.nc-final .signature a { + color: var(--nc-accent); + text-decoration: none; +} + +/* ── Footer ── */ + +.VPFooter { + border-top-color: var(--nc-border) !important; +} + +/* ── Responsive ── */ + +@media (max-width: 640px) { + .nc-section { + padding: 60px 20px 0; + } + + .nc-compare { + grid-template-columns: 1fr; + } + + .nc-final { + padding: 72px 20px 0; + } + + .nc-hero { + padding: 60px 20px 48px; + } + + .nc-steps { + grid-template-columns: 1fr; + } + + .nc-usecases { + grid-template-columns: 1fr; + } + + .nc-compare-spaced { + grid-template-columns: 1fr; } } -/** - * Component: Custom Block - * -------------------------------------------------------------------------- */ +/* ── Page Hero ── */ -:root { - --vp-custom-block-tip-border: transparent; - --vp-custom-block-tip-text: var(--vp-c-text-1); - --vp-custom-block-tip-bg: var(--vp-c-brand-soft); - --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); +.nc-hero { + text-align: center; + padding: 80px 24px 64px; + max-width: 780px; + margin: 0 auto; } -/** - * Component: Algolia - * -------------------------------------------------------------------------- */ +.nc-hero h1 { + font-family: 'DM Serif Display', Georgia, serif; + font-size: clamp(36px, 6vw, 64px); + font-weight: 400; + letter-spacing: -0.02em; + margin-bottom: 16px; + background: linear-gradient(135deg, var(--nc-gradient-from), var(--nc-gradient-to)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.nc-hero-tagline { + font-family: 'DM Serif Display', Georgia, serif; + font-size: clamp(26px, 4vw, 40px); + color: var(--nc-text); + margin-bottom: 20px; +} + +.nc-hero-tagline em { + color: var(--nc-accent); + font-style: normal; +} + +.nc-hero-desc { + font-size: 16px; + color: var(--vp-c-text-1); + line-height: 1.9; + max-width: 560px; + margin: 0 auto 16px; +} + +.nc-hero-desc a { + color: var(--nc-accent); +} + +.section-label { + font-size: 11px; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--nc-accent); + margin-bottom: 16px; +} + +/* ── Buttons ── */ + +.nc-actions { + display: flex; + gap: 12px; + justify-content: center; + margin-top: 32px; + flex-wrap: wrap; +} + +.nc-btn { + display: inline-block; + padding: 10px 24px; + font-size: 14px; + font-weight: 500; + letter-spacing: 0.02em; + color: var(--nc-bg); + background: var(--nc-accent); + text-decoration: none; + transition: background 0.2s, border-color 0.2s, color 0.2s, transform 0.15s; +} + +.nc-btn:hover { + background: var(--nc-gradient-to); + transform: translateY(-1px); +} + +.nc-btn-alt { + background: transparent; + color: var(--nc-text); + border: 1px solid var(--nc-border); +} + +.nc-btn-alt:hover { + border-color: var(--nc-accent); + color: var(--nc-accent); + background: transparent; + transform: translateY(-1px); +} + +/* ── Steps (numbered cards) ── */ + +.nc-steps { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 16px; + margin-top: 40px; +} + +.nc-step { + background: var(--nc-surface); + border: 1px solid var(--nc-border); + padding: 28px 24px; +} + +.nc-step-number { + display: inline-flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border: 1px solid var(--nc-accent); + color: var(--nc-accent); + font-size: 13px; + font-weight: 500; + margin-bottom: 16px; +} + +.nc-step h3 { + font-family: 'DM Serif Display', Georgia, serif; + font-size: 17px; + font-weight: 400; + margin-bottom: 8px; +} + +.nc-step p { + font-size: 14px; + color: var(--nc-muted); + line-height: 1.7; +} + +/* ── Use Case Cards ── */ + +.nc-usecases { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 16px; + margin-top: 40px; +} + +.nc-usecase { + background: var(--nc-surface); + border: 1px solid var(--nc-border); + padding: 24px; + display: flex; + gap: 16px; + align-items: flex-start; +} + +.nc-usecase-icon { + font-size: 22px; + flex-shrink: 0; +} + +.nc-usecase h4 { + font-size: 15px; + font-weight: 500; + margin-bottom: 6px; +} + +.nc-usecase p { + font-size: 14px; + color: var(--nc-muted); + line-height: 1.6; +} + +.nc-usecase-muted { + border-color: var(--nc-border-subtle); +} + +.nc-usecase-muted .nc-usecase-icon { + filter: grayscale(1); + opacity: 0.5; +} + +.nc-usecase-muted h4 { + color: var(--nc-muted); +} + +/* ── Prompt Box ── */ + +.nc-prompt-box { + background: var(--nc-surface); + border: 1px solid var(--nc-border); + margin-top: 40px; + overflow: hidden; +} + +.nc-prompt-header { + padding: 12px 20px; + background: var(--nc-bg); + border-bottom: 1px solid var(--nc-border); + font-size: 13px; + color: var(--nc-muted); +} + +.nc-prompt-body { + padding: 28px 24px; + font-size: 14px; + line-height: 1.8; + white-space: pre-wrap; +} + +.nc-prompt-path { + color: var(--nc-accent); + display: block; +} + +.nc-prompt-footer { + padding: 16px 24px; + border-top: 1px solid var(--nc-border); + background: var(--nc-bg); +} + +.nc-prompt-footer p { + font-size: 13px; + color: var(--nc-muted); + margin: 0; +} + +.nc-prompt-footer strong { + color: var(--nc-text); +} + +/* ── CTA Section ── */ + +.nc-cta { + max-width: 780px; + margin: 0 auto; + padding: 80px 24px; + text-align: center; + border-top: 1px solid var(--nc-border); +} + +.nc-cta h2 { + font-family: 'DM Serif Display', Georgia, serif; + font-size: clamp(24px, 4vw, 36px); + font-weight: 400; + margin-bottom: 12px; + border: none; + padding: 0; +} + +.nc-cta a { + color: var(--nc-accent); +} -.DocSearch { - --docsearch-primary-color: var(--vp-c-brand-1) !important; +.nc-cta p { + color: var(--nc-muted); + font-size: 15px; } diff --git a/behaviour.priming/index.md b/behaviour.priming/index.md index a96aa29..08fe501 100644 --- a/behaviour.priming/index.md +++ b/behaviour.priming/index.md @@ -1,91 +1,140 @@ --- -layout: home - -hero: - name: "//behaviour.priming" - text: "Stop thinking for the LLM." - tagline: Give it a disposition. Let it find the path. - actions: - - theme: alt - text: See the Minimal Prompt - link: "#minimal-prompt" - - theme: brand - text: See the Charged Prompt - link: "#charged-prompt" - -features: - - icon: "1️⃣" - title: Define Behaviour - details: Describe how the LLM should think, act, and interact. Give it a character, a stance, a way of operating — not a script. - - icon: "2️⃣" - title: Define Outcome - details: Specify what success looks like. What should exist when the session is over? Files, decisions, artefacts — make it concrete. - - icon: "3️⃣" - title: LLM Finds the Path - details: The model determines the best route. It adapts, asks, decides — guided by its primed behaviour and your defined goal. +layout: page +title: //behaviour.priming --- -> *A cast with scripts performs. Characters with depth find the play.* - -## Why it works - -### Delegate the path. Keep the standards. - -Behaviour Priming replaces procedures with principles, decision rules, and verification gates. You delegate the path — but keep the standards. Unlike role-prompting, you're not assigning a character. You're encoding a decision-making framework. - -| ⛓️ Procedure-first | ✦ Principle-first | -|---|---| -| Step-by-step workflow instructions | ✔️ Principles, decision rules, verification gates | -| Breaks when situation drifts | ✔️ Adapts naturally to context | -| You manage every edge case | ✔️ Model handles edge cases itself | -| Prompt gets longer with every issue | ✔️ Stays minimal, stays focused | - -## Use Cases - -### Works wherever the LLM needs to act. - -Best in sessions with user interaction — but equally effective in fully autonomous agentic tasks. - -- 💬 **Chat Agents** — Prime a persona and desired outcome before any conversation starts. The agent navigates the chat to get there. -- 🔬 **Discovery & Interviews** — Give the model an interviewer's mindset and a document to produce. It runs the session. -- ⚙️ **Technical Agentic Tasks** — Define an engineering behaviour and a deliverable. Let the agent decide how to build it. -- 🧠 **Teaching & Coaching** — Prime a teaching philosophy and learning outcome. The model adapts to the learner's zone in real time. - -## The Spectrum - -### Both work. One works harder. - -A minimal Behaviour Priming prompt tends to outperform a procedure-first prompt in interactive, drift-heavy sessions. But when the behaviour is *designed* — every phrase chosen to tune a specific response, every principle stated to prevent a known failure mode — the outcome doesn't just happen. It emerges. - -## Minimal Prompt {#minimal-prompt} - -### Two fields. That's all it takes. - -No workflow. No edge case handling. The model decides how to get there. - -::: tip Copy this prompt -Two inputs. The model decides how to run the interview, what to ask, when to stop, and how to structure the output. -::: - -```markdown -Behaviour: Act as Bob Moesta. Conduct a Jobs-to-be-Done interview. - -Outcome: -- jobs/{name}.md -- .github/prompts/{name}.prompt.md -``` - -## Go Deeper - -### When the behaviour is designed. - -Intentional redundancy. Overlapping phrasing stabilizes behaviour and reduces drift across long sessions. The charged prompt looks long — it might look badly written. That's by design. Each phrase is a behaviour instruction. Each section tunes a specific response pattern. The LLM isn't told what to do. It's *shaped* into something that **strongly biases the model toward the behaviour you need.** - -## Charged Prompt {#charged-prompt} - -### The same intent. Fully primed. - -The Jobs-to-be-Done Interview Coach — the same Bob Moesta, the same outcome. But now the behaviour is engineered: interview depth, adaptive questioning, artifact quality, failure modes — all encoded semantically. Both work. This one works harder. +
+ +

//behaviour.priming

+

Let the LLM do the thinking.

+

Stop writing workflows. Define how your AI should behave and what outcome you need — then let it find the best path on its own.

+

The origin and thesis behind this method is on the homepage — how semantic fields work and why they matter. This page is about how to use it.

+ +
+ +
+

01 — Method

+

Prime the behaviour. Define the outcome. Let go.

+

Instead of scripting every step, you set the stage. Two inputs. One autonomous agent.

+
+
+1 +

Define Behaviour

+

Describe how the LLM should think, act, and interact. Give it a character, a stance, a way of operating — not a script.

+
+
+2 +

Define Outcome

+

Specify what success looks like. What should exist when the session is over? Files, decisions, artefacts — make it concrete.

+
+
+3 +

LLM Finds the Path

+

The model determines the best route. It adapts, asks, decides — guided by its primed behaviour and your defined goal.

+
+
+
+ +
+

02 — Why it works

+

Delegate the path. Keep the standards.

+

Behaviour Priming replaces procedures with principles, decision rules, and verification gates. You delegate the path — but keep the standards. Unlike role-prompting, you're not assigning a character. You're encoding a decision-making framework.

+
+
+

⛓️ Procedure-first

+
    +
  • Step-by-step workflow instructions
  • +
  • Breaks when situation drifts
  • +
  • You manage every edge case
  • +
  • Prompt gets longer with every issue
  • +
+
+
+

✦ Principle-first

+
    +
  • Principles, decision rules, verification gates
  • +
  • Adapts naturally to context
  • +
  • Model handles edge cases itself
  • +
  • Stays minimal, stays focused
  • +
+
+
+
+ +
+

03 — Use Cases

+

Works wherever the LLM needs to act.

+

Best in sessions with user interaction — but equally effective in fully autonomous agentic tasks.

+
+
+💬 +
+

Chat Agents

+

Prime a persona and desired outcome before any conversation starts. The agent navigates the chat to get there.

+
+
+
+🔬 +
+

Discovery & Interviews

+

Give the model an interviewer's mindset and a document to produce. It runs the session.

+
+
+
+⚙️ +
+

Technical Agentic Tasks

+

Define an engineering behaviour and a deliverable. Let the agent decide how to build it.

+
+
+
+🧠 +
+

Teaching & Coaching

+

Prime a teaching philosophy and learning outcome. The model adapts to the learner's zone in real time.

+
+
+
+
+ +
+
A cast with scripts performs. Characters with depth find the play.
+
+ +
+

04 — The Spectrum

+

Both work. One works harder.

+

A minimal Behaviour Priming prompt tends to outperform a procedure-first prompt in interactive, drift-heavy sessions. But when the behaviour is designed — every phrase chosen to tune a specific response, every principle stated to prevent a known failure mode — the outcome doesn't just happen. It emerges.

+
+ +
+

05 — Minimal

+

Two fields. That's all it takes.

+

No workflow. No edge case handling. The model decides how to get there.

+
+
+behaviour-priming.prompt.md +
+
Behaviour: Act as Bob Moesta. Conduct a Jobs-to-be-Done interview.

Outcome:
- jobs/{name}.md
- .github/prompts/{name}.prompt.md
+ +
+
+ +
+

06 — Go Deeper

+

When the behaviour is designed.

+

Intentional redundancy. Overlapping phrasing stabilizes behaviour and reduces drift across long sessions. The charged prompt looks long — it might look badly written. That's by design. Each phrase is a behaviour instruction. Each section tunes a specific response pattern. The LLM isn't told what to do. It's shaped into something that strongly biases the model toward the behaviour you need.

+
+ +
+

07 — Charged

+

The same intent. Fully primed.

+

The Jobs-to-be-Done Interview Coach — the same Bob Moesta, the same outcome. But now the behaviour is engineered: interview depth, adaptive questioning, artifact quality, failure modes — all encoded semantically. Both work. This one works harder.

::: tip Copy this prompt Both work. This one works harder. @@ -95,12 +144,38 @@ Both work. This one works harder. ```` -## Limits - -### Not for everything. - -Behaviour Priming works where judgment, adaptation, and context matter. There are places it doesn't belong. - -- ⚙️ **Deterministic pipelines** — When every step must execute in a fixed sequence and be auditable, use a procedure. Not this. -- 📋 **Compliance workflows** — Regulated outputs with zero tolerance for variation need scripts, not principles. -- 📐 **Strict output schemas** — If the format is the contract — JSON, XML, exact field mappings — enforce it structurally, not behaviourally. +
+ +
+

08 — Limits

+

Not for everything.

+

Behaviour Priming works where judgment, adaptation, and context matter. There are places it doesn't belong.

+
+
+⚙️ +
+

Deterministic pipelines

+

When every step must execute in a fixed sequence and be auditable, use a procedure. Not this.

+
+
+
+📋 +
+

Compliance workflows

+

Regulated outputs with zero tolerance for variation need scripts, not principles.

+
+
+
+📐 +
+

Strict output schemas

+

If the format is the contract — JSON, XML, exact field mappings — enforce it structurally, not behaviourally.

+
+
+
+
+ +
+

Try it yourself on //prompt.forge

+

Submit a real use case. Get a prompt built with Behaviour Priming.

+
diff --git a/index.md b/index.md index f2f14e9..8a09b54 100644 --- a/index.md +++ b/index.md @@ -1,38 +1,119 @@ --- -# https://vitepress.dev/reference/default-theme-home-page layout: home hero: name: "Martin Haberfellner" - text: "AI amplifies what's already there." - tagline: Shit in, shit out. That's not a tool problem. + text: "LLMs don't follow instructions. They resonate with fields." + tagline: Everything built here starts from one question nobody was asking. actions: - theme: brand - text: How I think about it + text: The Method link: /behaviour.priming/ - theme: alt - text: Where I test it + text: The Experiments link: /proto.labs/ - -features: - - icon: ✦ - title: //behaviour.priming - details: I give LLMs a disposition, not a script. Principles over procedures. The outcome emerges — it isn't coerced. - link: /behaviour.priming/ - - icon: 🧪 - title: //proto.labs - details: Experiments, prompts, and tools built on this method. Some fail. All teach. Take what's useful. - link: /proto.labs/ - - icon: 🔨 - title: //prompt.forge - details: Test the method on your own use case. Submit a real job — get a prompt built on Behaviour Priming. - link: /prompt.forge/ --- -## How I Think +
+ +
+

01 — The Question

+

Why does an LLM follow instructions it doesn't understand?

+

A video. Someone explaining LLM workflows with clarity and depth. Concepts well-named, patterns well-described. But one assumption taken for granted: the model does what you tell it.

+

That assumption felt wrong. Not as a technical objection — as an intuition. If the model doesn't truly understand intent, how does instruction-following happen at all? Why does it work? And more importantly: why does it sometimes not?

+
+

"If it can't understand me, why does it follow me at all?"

+
+

One afternoon. That question led somewhere nobody had pointed to yet. Not a refinement of existing prompt engineering. A different foundation entirely.

+
+ +
+

02 — The Discovery

+

Every prompt creates a field. The question is whether you designed it.

+

The model doesn't read a prompt and execute it. It enters a semantic space. That space shapes every response that follows. User input doesn't drive the model. It creates interference in the field. The model responds to the interference from within the field.

+

This is not a choice between instructions and fields. Fields always emerge. An instruction-based prompt creates one too — accidental, noisy, unstable. The instructions are just the debris the field is built from. It often works. But it drifts. It breaks under unexpected input. It costs more than it should.

+
+
+

Accidental field

+

Emerges from instructions

+

Noisy — every word is potential interference

+

Unstable under unexpected input

+

Drift = more instructions

+
+
+

Designed field

+

Built from values and principles

+

Dense — every word earns its place

+

Stable — handles what you didn't anticipate

+

Drift disappears

+
+
+

The difference is not whether a field exists. It's whether it was designed or happened by accident. Designed fields hold. Accidental fields eventually break.

+
+ +
+

03 — The Compiler

+

Designing a field requires a different kind of thinking.

+

Natural language is built for human action. It thinks in steps, causes, intentions. To design a semantic field, you need something that thinks in dynamics — not steps. Not "do X then Y." But: what forces are at work? What should amplify? What should resist? Where is the centre of gravity?

+

That thinking doesn't come naturally. So the process gets compiled. Intent — values, principles, desired behaviour — goes in. A semantically charged field definition comes out. The compiler bridges how humans think and how fields work.

+
+

"Every word in a prompt is introduced noise. The compiler removes the noise. What remains is pure semantic charge."

+
+

A compiled prompt looks unusual. It may seem redundant. It may look inefficient. That is by design. Intentional redundancy is semantic reinforcement — the same tone on multiple frequencies, making the field more stable, not louder.

+

When a prompt is semantically saturated, adding more concepts changes nothing. That's not a limitation. That's the signal that the field is complete.

+
+ +
+

04 — Consequences

+

Why the industry still gets this wrong.

+

Most prompt engineering is software engineering wearing a different hat. Deterministic thinking applied to a probabilistic system. Define every step. Anticipate every case. Control every output.

+

This suppresses exactly what makes LLMs powerful: emergent understanding, implicit knowledge, contextual judgment. The more you over-specify, the more you undermine the model.

+

Multi-agent systems do the same. One LLM prompting another — imitating how a human explains something to a less experienced human. Step by step. Spelled out. As if the other model doesn't already carry the same implicit knowledge. Two experts talking like one of them is a beginner.

+

The pattern is everywhere. AI in human workflows. AI in development pipelines. The host thinks. The subagent executes. Nobody asks why the subagent isn't trusted to think.

+
+

"Frame. Goal. Trust. The model finds the path. That's not vague — that's accurate."

+
+
-I don't write AI scripts. I give LLMs a disposition — a personality, a value system, a way of operating — and let the outcome emerge. I call it **Behaviour Priming**. +
+

05 — Method

+

Behaviour Priming. Not programming. Activating.

+

The capability is already there. Every LLM has absorbed how interviews work. How coaching works. How a Socratic conversation feels. How to hold space. How to push back gently. How to recognize when someone is overwhelmed.

+

It's in the training data — everywhere, implicit, deep. You don't teach it. You prime it.

+
+

Behaviour Priming — how it works

+
+ +Values + Principles +the foundation of intent +
+
+ +Compilation +intent becomes a field definition +
+
+ +Semantic Saturation +density, not length — every word earns its place +
+
+ +User Input as Interference +the field responds — not the instruction list +
+
+ +Stable Behaviour +consistent across models, sessions, edge cases +
+
+

A primed prompt works across LLMs not because it was calibrated for each one — but because it activates something already present in all of them. The field doesn't teach it. It unlocks it.

+
-It's built on systems thinking. Shaped by Lean, YAGNI, and Shift Left. Applied to the full SDLC. I'm active in the field, testing what works, and sharing what I find. +
+

The question nobody was asking was the only one that mattered.

+

This is not a framework. It's not a methodology to adopt. It's a shift in how you see the thing. Once you see it, the prompts write themselves differently. The results hold differently. The drift disappears.

+
-If that's how you think too — you're in the right place. +
diff --git a/prompt.forge/index.md b/prompt.forge/index.md index 9867a98..131de07 100644 --- a/prompt.forge/index.md +++ b/prompt.forge/index.md @@ -16,28 +16,20 @@ hero: ## The Experiment -**Behaviour Priming** is my prompt design method. For me, it works exceptionally well. Through this experiment, I'm testing whether that's true for others too. +**[Behaviour Priming](/)** works for me. Through this experiment, I'm testing whether that's true for others too. ### How It Works -1. Use the **[Job-to-be-Done interview prompt](/proto.labs/job-to-be-done)** (built on Behaviour Priming) to document what you're trying to accomplish -2. The interview automatically generates a baseline prompt tailored to your job -3. Submit your job via GitHub – I'll create an improved version for selected cases using Behaviour Priming techniques -4. Test both, share what works better for you +1. Use the **[Job-to-be-Done interview prompt](/proto.labs/job-to-be-done)** to document what you're trying to accomplish +2. The interview generates a baseline prompt tailored to your job +3. Submit your job via GitHub — I'll create an improved version using Behaviour Priming +4. Test both, share what works better **→ [Join the Experiment on GitHub](https://github.com/evilru/prompt.forge)** -See examples · Submit your job · Get your improved prompt - ## Why Participate -Behaviour Priming works better for me. But don't take my word for it – try it yourself. - -You get a custom prompt built with Behaviour Priming for selected use cases. I get real-world feedback on whether this method works for others. - -This is open research. Your experience shapes the evolution of Behaviour Priming. - ---- +You get a custom prompt built with Behaviour Priming. I get real-world feedback on whether the method translates. -**Note:** This is experimental research, not a maintained tool library. Full details and examples on GitHub. +Open research. Your experience shapes the evolution. diff --git a/proto.labs/index.md b/proto.labs/index.md index 7523764..3498b23 100644 --- a/proto.labs/index.md +++ b/proto.labs/index.md @@ -16,16 +16,10 @@ hero: ## Current Experiments {#experiments} -This is where I test ideas. Built on **[Behaviour Priming](/behaviour.priming/)** — the method I use for everything. Some of these are polished enough to use. Some are still rough. All of them are real. +Built on **[Behaviour Priming](/behaviour.priming/)** — the method described in the [manifest](/). Some of these are polished enough to use. Some are still rough. All of them are real. Take what's useful. Break what isn't. -### Behaviour Priming - -Stop writing workflows. Define how your AI should behave and what outcome you need — then let it find the best path on its own. Principles over procedures. Autonomy over scripts. - -**→ [Explore Behaviour Priming](/behaviour.priming/)** - ### Job To Be Done Prompt Writing good prompts is hard. Most people don't realize how much unstated context affects the result. This meta-prompt applies Behaviour Priming principles through structured discovery – inspired by how Bob Moesta interviews customers to uncover their real needs. @@ -38,24 +32,9 @@ AI can make you lazy. Copy-paste solutions without understanding. This prompt ap **→ [Activate Learning Zone Mode](/proto.labs/learning-zone-mode.md)** -## Philosophy - -This is not a portfolio of polished products – it's a laboratory. -Experiments here are: - -- **Transparent**: You see the process, not just results -- **Participatory**: Your input shapes the evolution -- **Iterative**: Nothing is "finished", everything learns - -Think of this as open research. Snapshots of exploration, not production tools. - ## Get Involved -**Tried the prompts?** [Share your experience](https://github.com/evilru/prompt.forge) - -**Want an improved prompt?** Submit your use case – I'll create a custom version for you - -**Want to discuss?** Join the [discussions](https://github.com/evilru/prompt.forge/discussions) +**Tried the prompts?** [Share your experience on GitHub](https://github.com/evilru/prompt.forge) -Let's build, test, and learn together. +**Want a custom prompt?** Submit your use case via **[//prompt.forge](/prompt.forge/)** — I'll build one using Behaviour Priming. From 2e4265cc3b720613f9a3d97bfcdffc2326aa91cb Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 19 Mar 2026 20:16:15 +0100 Subject: [PATCH 06/23] =?UTF-8?q?feat:=20=E2=9C=A8=20update=20homepage=20t?= =?UTF-8?q?agline=20and=20add=20navigation=20section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/index.md b/index.md index 8a09b54..25130d0 100644 --- a/index.md +++ b/index.md @@ -4,7 +4,7 @@ layout: home hero: name: "Martin Haberfellner" text: "LLMs don't follow instructions. They resonate with fields." - tagline: Everything built here starts from one question nobody was asking. + tagline: Fix the processes, not the symptoms. 25 years. Now with AI. actions: - theme: brand text: The Method @@ -12,6 +12,12 @@ hero: - theme: alt text: The Experiments link: /proto.labs/ + - theme: alt + text: Who + link: /martin-haberfellner + - theme: alt + text: Thinking + link: /thinking/ ---
From 96d4e433b502040955514020462a9a426246402d Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 19 Mar 2026 20:16:28 +0100 Subject: [PATCH 07/23] =?UTF-8?q?feat:=20=F0=9F=93=9D=20add=20context=20se?= =?UTF-8?q?ction=20explaining=20behaviour=20priming=20origins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- behaviour.priming/index.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/behaviour.priming/index.md b/behaviour.priming/index.md index 08fe501..4fd775a 100644 --- a/behaviour.priming/index.md +++ b/behaviour.priming/index.md @@ -179,3 +179,11 @@ Both work. This one works harder.

Try it yourself on //prompt.forge

Submit a real use case. Get a prompt built with Behaviour Priming.

+ +
+

Context

+

Why this method exists.

+

Behaviour Priming didn't start as a framework. It started as a question: if an LLM doesn't truly understand intent, why does it follow instructions at all — and why does it sometimes fail? The method is the answer to that question, developed in practice.

+

The same thinking that led here — fix the process, not the symptom; structure before speed; the system behind the system — runs through everything built on this site. More about that.

+

See how this thinking extends beyond prompting, into AI-native development and what comes after the SDLC: /thinking.

+
From 9e355a0ddfcbbd1dfb9cf4226bc8c782cc99689b Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 19 Mar 2026 20:16:39 +0100 Subject: [PATCH 08/23] =?UTF-8?q?feat:=20=E2=9C=A8=20add=20related=20insig?= =?UTF-8?q?hts=20section=20to=20proto.labs=20index?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proto.labs/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/proto.labs/index.md b/proto.labs/index.md index 3498b23..de239cc 100644 --- a/proto.labs/index.md +++ b/proto.labs/index.md @@ -38,3 +38,7 @@ AI can make you lazy. Copy-paste solutions without understanding. This prompt ap **Want a custom prompt?** Submit your use case via **[//prompt.forge](/prompt.forge/)** — I'll build one using Behaviour Priming. +## Related + +Thinking about what experiments like these point toward — autonomous development, the data loop, what comes after the SDLC: **[/thinking](/thinking/)** + From 7cc0c1f498bb382a5217ddb0376ea19efb50a93f Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 19 Mar 2026 20:17:08 +0100 Subject: [PATCH 09/23] =?UTF-8?q?feat:=20=E2=9C=A8=20add=20Martin=20Haberf?= =?UTF-8?q?ellner=20profile=20page=20with=20principles=20and=20AI=20focus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- martin-haberfellner.md | 60 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 martin-haberfellner.md diff --git a/martin-haberfellner.md b/martin-haberfellner.md new file mode 100644 index 0000000..4d26a3f --- /dev/null +++ b/martin-haberfellner.md @@ -0,0 +1,60 @@ +--- +layout: page +title: Martin Haberfellner +--- + +
+ +

Martin Haberfellner

+

I build the system behind the system.

+
+ +
+

For 25 years — across platforms, teams, and now AI — the interesting problem was never the feature. It was always what made the feature possible, sustainable, and worth building in the first place.

+

Currently at Tietoevry, where AI is everything I do: strategy, adoption, assessment, integration into the SDLC. The work is always the same: find the waste, build the right foundation, let things flow.

+

Active in the field. Thinking out loud here.

+
+ +
+

Principles

+ +
+
+

Fix the processes, not the symptoms.

+

Every problem has a comfortable patch and an uncomfortable root. I go for the root. Behaviour Priming exists because the prompting process was broken, not the prompts.

+
+ +
+

Lean → DevOps Maturity → AI Maturity. In that order.

+

Buying everyone a better editor has never helped anyone. Giving everyone Copilot doesn't either — until the processes underneath are worth accelerating. AI amplifies what's already there. Chaos and excellence equally.

+
+ +
+

Evolutionary over rewrite.

+

One framework carried 20+ international platforms for 15 years without a full rewrite. Longevity isn't conservatism — it's evidence that the foundation was right.

+
+ +
+

The system behind the system.

+

Products are built by systems. Teams are shaped by culture. AI outputs reflect organizational quality. The real work starts one level deeper than where the problem is visible.

+
+ +
+

Waste first, ROI from day one.

+

Not because of budget. Because burned effort demoralizes. The first win should come fast and be real. Everything built on top of it gets cheaper.

+
+ +
+

Freedom as outcome.

+

When a system works — really works — people stop fighting it and start using it to think. That's the goal. Systems that liberate rather than constrain.

+
+
+
+ +
+

Currently

+

AI strategy and adoption in enterprise software development.

+

Specifically: how to integrate AI into the SDLC in a way that isn't just faster — but structurally different. What does a development process look like when autonomous agents handle execution? What's the loop that remains?

+

Building Behaviour Priming — a method for giving LLMs a disposition instead of a script. Testing it in the open via proto.labs.

+

Thinking out loud in /thinking.

+
From 0b38f644a9ce9aa93f6de244617b064c32a8cd32 Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 19 Mar 2026 20:17:20 +0100 Subject: [PATCH 10/23] =?UTF-8?q?feat:=20=E2=9C=A8=20add=20thinking=20sect?= =?UTF-8?q?ion=20with=20ai-native=20SDLC=20and=20terminal=20cycle=20essays?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- thinking/ai-native-sdlc.md | 73 ++++++++++++++++++++++++++++++++++++++ thinking/index.md | 16 +++++++++ thinking/terminal-cycle.md | 48 +++++++++++++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 thinking/ai-native-sdlc.md create mode 100644 thinking/index.md create mode 100644 thinking/terminal-cycle.md diff --git a/thinking/ai-native-sdlc.md b/thinking/ai-native-sdlc.md new file mode 100644 index 0000000..2376f84 --- /dev/null +++ b/thinking/ai-native-sdlc.md @@ -0,0 +1,73 @@ +--- +layout: page +title: What's left when development is autonomous. +--- + +
+ +

What's left when development is autonomous.

+
+ +
+

Assume the agent handles implementation. Another agent handles operations — Terraform, Kubernetes, configuration, deployment. Both are nearly there today. In 1–2 years, close enough.

+ +

What's the loop that remains?

+ +
+

Data → Hypothesis → A/B Test → Requirement → Data → ...

+
+ +

That's it. That's the residual human loop — not because it can't be automated, but because it's the loop where organizational intelligence lives. Where business context meets system signal. Where intent is formed.

+
+ +
+

The data that drives it

+

Requirements are data too.

+ +

Most agentic SDLC thinking focuses on the execution layer: faster code, automated deploys. That's the easy part. The harder insight is that the entire input surface is data:

+ +
+
+

Infrastructure signals

+

Terraform state, K8s events, resource metrics, config drift

+
+
+

Application signals

+

Traces, error rates, latency, A/B results, conversion

+
+
+

Business signals

+

KPIs, user behavior, feature requests, support patterns

+
+
+

Requirement signals

+

User feedback, issues, stated needs — structurally identical to the others

+
+
+ +

When requirements are treated as data, the loop closes. The system can generate hypotheses, run experiments, implement winners, measure outcomes — and feed results back as new signal. At every layer simultaneously.

+
+ +
+

The wrong question

+

Why is everyone building a human process in an agent?

+ +

Current agentic SDLC approaches copy the shape of how humans work: ticket → branch → PR → review → deploy. The same steps, faster. That's not a new process. That's an old process with a faster executor.

+ +

The right question isn't "how do we automate what developers do?" It's "what does a process look like that was designed for an agent from the start?"

+ +

An agent doesn't need a ticket system. It needs a signal. It doesn't need a sprint. It needs a priority function. It doesn't need a PR. It needs a verification gate.

+ +
+

"Fix your fucking processes. Then automate them."

+
+ +

The sequence matters. AI on top of broken processes doesn't produce better software faster. It produces broken software faster.

+
+ +
+

Where this is going

+

This is a working concept, not a finished argument.

+

Some of this I'm exploring with others. What the data loop actually looks like in practice. Where humans stay in the loop not because they have to, but because they add something irreplaceable. What the MCP layer means for frontend — and whether what we call "the web" is about to change shape again.

+

More as it becomes clearer.

+
diff --git a/thinking/index.md b/thinking/index.md new file mode 100644 index 0000000..8032137 --- /dev/null +++ b/thinking/index.md @@ -0,0 +1,16 @@ +--- +layout: home + +hero: + name: "//thinking" + text: "Ideas in progress." + tagline: Not finished thoughts. Not polished essays. Things worth writing down before they disappear. +--- + +## Recent + +### [The terminal never left.](/thinking/terminal-cycle) +We spent 40 years building abstractions on top of the command line. The agents run in terminals again. The cycle completed itself. + +### [What's left when development is autonomous.](/thinking/ai-native-sdlc) +If an agent handles implementation and another handles operations — what's the loop that remains? And who owns it? diff --git a/thinking/terminal-cycle.md b/thinking/terminal-cycle.md new file mode 100644 index 0000000..9336749 --- /dev/null +++ b/thinking/terminal-cycle.md @@ -0,0 +1,48 @@ +--- +layout: page +title: The terminal never left. +--- + +
+ +

The terminal never left.

+
+ +
+

We spent 40 years building abstractions on top of the command line.

+ +
+
+

1969 — /usr/bin

+

The terminal. Direct contact with the machine. Text in, text out. Everything visible, nothing hidden.

+
+
+

1984 — Desktop

+

The GUI. The terminal hidden behind icons. Easier to start. Harder to compose. The interface became the product.

+
+
+

1995 — Browser

+

The GUI distributed. Everything becomes a page. The desktop abstracted away. Location replaces command.

+
+
+

2007 — Mobile

+

The browser replaced by the app. Tap instead of click. The URL disappears. Direct access to single functions.

+
+
+

2025 — /usr/bin

+

The coding agent runs in the terminal. Data lives in text files. TUI is cool again. The abstractions collapsed back to the substrate.

+
+
+ +

Each layer hid the complexity of the one before — until the layer itself became the complexity. When the interface becomes the bottleneck, the system finds a way around it.

+ +

AI didn't replace the terminal. It revealed that the terminal was always the honest layer.

+ +
+

"The simplest form isn't primitive. It's what remains when everything unnecessary has been removed."

+
+ +

This is also why Behaviour Priming works the way it does. No abstraction over intent. Direct contact with the semantic substrate. The same principle, one level deeper.

+ +

And it's why desktop agents that click through GUIs because there's no API are not progress. They're a workaround for systems that should have been designed better. Fix the processes.

+
From 7ec181232f15b3f2edc63db06d047b7ded705d2b Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 19 Mar 2026 21:10:41 +0100 Subject: [PATCH 11/23] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20clean=20?= =?UTF-8?q?up=20navigation=20links=20across=20config=20and=20index=20pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/config.mts | 11 ++--------- index.md | 7 ++----- prompt.forge/index.md | 2 +- proto.labs/index.md | 5 +---- 4 files changed, 6 insertions(+), 19 deletions(-) diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 55c5e6c..8ca6ef0 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -73,19 +73,12 @@ export default defineConfig({ }, nav: [ { text: '//behaviour.priming', link: '/behaviour.priming/index.md' }, + { text: '//thinking', link: '/thinking/index.md' }, { text: '//proto.labs', link: '/proto.labs/index.md' }, { text: '//prompt.forge', link: '/prompt.forge/index.md' }, - // { - // text: 'Legal', - // items: [ - // { text: 'Imprint', link: '/imprint.md' }, - // { text: 'Privacy', link: '/privacy.md' }, - // { text: 'License', link: '/LICENSE.md' } - // ] - // } ], footer: { - message: 'Imprint | Privacy | License', + message: 'About | Imprint | Privacy | License', copyright: '© 2026 Martin Haberfellner · All Rights Reserved' }, sidebar: { diff --git a/index.md b/index.md index 25130d0..2ff3ddf 100644 --- a/index.md +++ b/index.md @@ -7,17 +7,14 @@ hero: tagline: Fix the processes, not the symptoms. 25 years. Now with AI. actions: - theme: brand - text: The Method + text: Behaviour Priming link: /behaviour.priming/ - theme: alt - text: The Experiments + text: See the Experiments link: /proto.labs/ - theme: alt text: Who link: /martin-haberfellner - - theme: alt - text: Thinking - link: /thinking/ ---
diff --git a/prompt.forge/index.md b/prompt.forge/index.md index 131de07..41079db 100644 --- a/prompt.forge/index.md +++ b/prompt.forge/index.md @@ -10,7 +10,7 @@ hero: text: Join the Experiment link: https://github.com/evilru/prompt.forge - theme: alt - text: See the Method + text: Behaviour Priming link: /behaviour.priming/ --- diff --git a/proto.labs/index.md b/proto.labs/index.md index de239cc..86d6460 100644 --- a/proto.labs/index.md +++ b/proto.labs/index.md @@ -9,9 +9,6 @@ hero: - theme: brand text: Browse Experiments link: "#experiments" - - theme: alt - text: Start with the Job To Be Done Prompt - link: /proto.labs/job-to-be-done --- ## Current Experiments {#experiments} @@ -40,5 +37,5 @@ AI can make you lazy. Copy-paste solutions without understanding. This prompt ap ## Related -Thinking about what experiments like these point toward — autonomous development, the data loop, what comes after the SDLC: **[/thinking](/thinking/)** +Where the experiments lead — short thoughts, observations, things worth writing down before they disappear: **[//thinking](/thinking/)** From a56b7d31128354ec47bbfbd3accb425f3ff007ba Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Thu, 19 Mar 2026 21:30:06 +0100 Subject: [PATCH 12/23] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20migrate?= =?UTF-8?q?=20behaviour=20priming=20hero=20to=20NcHero=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- behaviour.priming/index.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/behaviour.priming/index.md b/behaviour.priming/index.md index 4fd775a..1704670 100644 --- a/behaviour.priming/index.md +++ b/behaviour.priming/index.md @@ -1,19 +1,19 @@ --- -layout: page +layout: home title: //behaviour.priming ---- -
- -

//behaviour.priming

-

Let the LLM do the thinking.

-

Stop writing workflows. Define how your AI should behave and what outcome you need — then let it find the best path on its own.

-

The origin and thesis behind this method is on the homepage — how semantic fields work and why they matter. This page is about how to use it.

- -
+hero: + name: "//behaviour:priming" + text: "Let the LLM do the thinking." + tagline: "Stop writing workflows. Define how your AI should behave and what outcome you need — then let it find the best path on its own." + actions: + - theme: alt + text: See the Minimal Prompt + link: "#minimal-prompt" + - theme: brand + text: See the Charged Prompt + link: "#charged-prompt" +---

01 — Method

From 76823a83f919f3e05bbc46e968d05c546e9d7cde Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sat, 21 Mar 2026 20:28:26 +0100 Subject: [PATCH 13/23] =?UTF-8?q?feat:=20=E2=9C=A8=20add=20NcHero=20Vue=20?= =?UTF-8?q?component=20and=20refactor=20global=20stylesheet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/theme/components/NcHero.vue | 7 + .vitepress/theme/index.ts | 2 + .vitepress/theme/style.css | 619 ++++++++++--------------- thinking/ai-native-sdlc.md | 10 +- thinking/terminal-cycle.md | 8 +- 5 files changed, 273 insertions(+), 373 deletions(-) create mode 100644 .vitepress/theme/components/NcHero.vue diff --git a/.vitepress/theme/components/NcHero.vue b/.vitepress/theme/components/NcHero.vue new file mode 100644 index 0000000..ebf435d --- /dev/null +++ b/.vitepress/theme/components/NcHero.vue @@ -0,0 +1,7 @@ + diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts index d739fd4..5610811 100644 --- a/.vitepress/theme/index.ts +++ b/.vitepress/theme/index.ts @@ -3,6 +3,7 @@ import { h } from 'vue' import type { Theme } from 'vitepress' import DefaultTheme from 'vitepress/theme' import VersionBadge from './components/VersionBadge.vue' +import NcHero from './components/NcHero.vue' import './style.css' // Read version once at module level @@ -17,6 +18,7 @@ export default { }) }, enhanceApp({ app, router, siteData }) { + app.component('NcHero', NcHero) // Provide version globally for any component to use app.config.globalProperties.$version = APP_VERSION } diff --git a/.vitepress/theme/style.css b/.vitepress/theme/style.css index 3846980..bd9355f 100644 --- a/.vitepress/theme/style.css +++ b/.vitepress/theme/style.css @@ -1,12 +1,10 @@ /** - * neoncode.systems — Manifest Theme - * - * Typography: DM Serif Display (headings) + DM Mono (body) - * Palette: Warm dark (#0a0a0a, #c8b89a accent) - * Direction: TRON ARES (dark + warm, future: red/cyan split) + * neoncode.systems theme + * Typography: DM Serif Display (headings) / DM Mono (body) + * Palette: warm dark — TRON ARES */ -/* ── Palette: Dark (default) ── */ +/* ── Design tokens ── */ :root { --nc-bg: #0a0a0a; @@ -18,12 +16,10 @@ --nc-accent: #c8b89a; --nc-accent-dim: rgba(200, 184, 154, 0.15); --nc-accent-border: rgba(200, 184, 154, 0.3); - --nc-gradient-from: #c8b89a; - --nc-gradient-to: #f0e6d0; + --nc-gradient-from: #f0e6d0; + --nc-gradient-to: #9a7040; } -/* ── Palette: Light ── */ - html:not(.dark) { --nc-bg: #faf9f6; --nc-surface: #f0eeea; @@ -38,7 +34,7 @@ html:not(.dark) { --nc-gradient-to: #a08860; } -/* ── VitePress Overrides: Brand ── */ +/* ── VitePress token mapping ── */ :root { --vp-c-default-1: var(--vp-c-gray-1); @@ -65,11 +61,7 @@ html:not(.dark) { --vp-c-danger-2: var(--vp-c-red-2); --vp-c-danger-3: var(--vp-c-red-3); --vp-c-danger-soft: var(--vp-c-red-soft); -} -/* ── VitePress Overrides: Buttons ── */ - -:root { --vp-button-brand-border: transparent; --vp-button-brand-text: var(--nc-bg); --vp-button-brand-bg: var(--nc-accent); @@ -79,9 +71,10 @@ html:not(.dark) { --vp-button-brand-active-border: transparent; --vp-button-brand-active-text: var(--nc-bg); --vp-button-brand-active-bg: var(--nc-accent); -} -/* ── VitePress Overrides: Dark Theme ── */ + --vp-font-family-base: 'DM Mono', 'Menlo', 'Monaco', 'Consolas', monospace; + --vp-font-family-mono: 'DM Mono', 'Menlo', 'Monaco', 'Consolas', monospace; +} .dark { --vp-c-bg: var(--nc-bg); @@ -98,8 +91,8 @@ html:not(.dark) { --vp-nav-bg-color: rgba(10, 10, 10, 0.9); --vp-sidebar-bg-color: var(--nc-bg); - --vp-home-hero-name-color: var(--nc-text); - --vp-home-hero-name-background: none; + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: linear-gradient(135deg, var(--nc-gradient-from), var(--nc-gradient-to)); --vp-home-hero-image-background-image: none; --vp-home-hero-image-filter: none; @@ -109,8 +102,6 @@ html:not(.dark) { --vp-custom-block-tip-code-bg: var(--nc-accent-dim); } -/* ── VitePress Overrides: Light Theme ── */ - html:not(.dark) { --vp-c-bg: var(--nc-bg); --vp-c-bg-soft: var(--nc-surface); @@ -126,8 +117,8 @@ html:not(.dark) { --vp-nav-bg-color: rgba(250, 249, 246, 0.9); --vp-sidebar-bg-color: var(--nc-bg); - --vp-home-hero-name-color: var(--nc-text); - --vp-home-hero-name-background: none; + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: linear-gradient(135deg, var(--nc-gradient-from), var(--nc-gradient-to)); --vp-home-hero-image-background-image: none; --vp-home-hero-image-filter: none; @@ -137,23 +128,8 @@ html:not(.dark) { --vp-custom-block-tip-code-bg: var(--nc-accent-dim); } -/* ── Typography ── */ - -:root { - --vp-font-family-base: 'DM Mono', 'Menlo', 'Monaco', 'Consolas', monospace; - --vp-font-family-mono: 'DM Mono', 'Menlo', 'Monaco', 'Consolas', monospace; -} - -h1, h2, h3, h4, h5, h6 { - font-family: 'DM Serif Display', Georgia, serif; - letter-spacing: -0.02em; -} - -/* ── Navigation ── */ - -.VPNav { - border-bottom-color: var(--nc-border) !important; -} +/* ── VitePress component overrides ── + Only where VP hardcodes values that custom properties cannot reach. ── */ .VPNavBar .title { font-size: 13px; @@ -161,18 +137,8 @@ h1, h2, h3, h4, h5, h6 { letter-spacing: 0.05em; } -/* ── Hero (Home + Sub-pages) ── */ - -.VPHero .name .clip { - -webkit-text-fill-color: var(--nc-text) !important; - background: none !important; - font-family: 'DM Serif Display', Georgia, serif; - font-weight: 400; -} - +/* VP hardcodes hero text size and line-height in component styles */ .VPHero .text { - font-family: 'DM Serif Display', Georgia, serif; - font-weight: 400; font-size: clamp(32px, 5vw, 56px) !important; line-height: 1.15 !important; max-width: 700px; @@ -180,7 +146,6 @@ h1, h2, h3, h4, h5, h6 { .VPHero .tagline { font-size: 14px !important; - color: var(--nc-muted) !important; line-height: 1.9; max-width: 480px; } @@ -189,75 +154,49 @@ h1, h2, h3, h4, h5, h6 { display: none; } -/* ── Feature Cards (Sub-pages) ── */ - +/* VP hardcodes feature card border and background in component styles */ .VPFeature { border-color: var(--nc-border) !important; background-color: var(--nc-surface) !important; } .VPFeature .title { - font-family: 'DM Serif Display', Georgia, serif; font-weight: 400 !important; } -/* ── Document Content ── */ +/* ── Base typography ── */ -.vp-doc h2 { +h1, h2, h3, h4, h5, h6 { font-family: 'DM Serif Display', Georgia, serif; font-weight: 400; - border-top-color: var(--nc-border); + letter-spacing: -0.02em; } -.vp-doc h3 { - font-family: 'DM Serif Display', Georgia, serif; - font-weight: 400; +/* VP adds border-top to doc headings — keep border color consistent */ +.vp-doc h2 { + border-top-color: var(--nc-border); } -/* ── Manifest Sections (Homepage) ── */ +/* ── .manifest (homepage content wrapper) ── */ .manifest { width: 100%; } +/* ── .nc-section ── */ + .nc-section { max-width: 780px; margin: 0 auto; padding: 80px 24px 0; - /* border-bottom: 1px solid var(--nc-border); */ -} - -.nc-section:last-child { - border-bottom: none; } .nc-section-border-top { - border-bottom: none; border-top: 1px solid var(--nc-border); } -.section-index { - font-size: 11px; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--nc-muted); - margin-bottom: 48px; - display: flex; - align-items: center; - gap: 16px; -} - -.section-index::after { - content: ""; - flex: 1; - height: 1px; - background: var(--nc-border); -} - .nc-section h2 { - font-family: 'DM Serif Display', Georgia, serif; font-size: clamp(28px, 4vw, 48px); - font-weight: 400; line-height: 1.15; margin-bottom: 32px; border-top: none; @@ -283,187 +222,120 @@ h1, h2, h3, h4, h5, h6 { .nc-section > p em { color: var(--nc-accent); - font-style: italic; } -/* ── Quotes ── */ - -.nc-quote { - border-left: 1px solid var(--nc-accent); - padding: 24px 32px; - margin: 40px 0; - background: var(--nc-accent-dim); +.section-index { + font-size: 11px; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--nc-muted); + margin-bottom: 48px; + display: flex; + align-items: center; + gap: 16px; } -.nc-quote p, -.nc-quote blockquote { - font-family: 'DM Serif Display', Georgia, serif; - font-size: clamp(18px, 2.5vw, 26px); - font-style: italic; - color: var(--nc-accent); - line-height: 1.5; - margin: 0; - max-width: none; - border: none; - padding: 0; +.section-index::after { + content: ""; + flex: 1; + height: 1px; + background: var(--nc-border); } -.nc-quote-center { - border-left: none; - text-align: center; - padding: 64px 24px; - margin: 0 auto; - max-width: 780px; - background: none; - border-top: 1px solid var(--nc-border); -} +/* ── .nc-hero ── */ -.nc-quote-center blockquote { - font-size: clamp(20px, 3vw, 28px); - line-height: 1.4; - max-width: 600px; +.nc-hero { + max-width: 780px; margin: 0 auto; + padding: 80px 24px 64px; + text-align: center; } -/* ── Compare Grid ── */ - -.nc-compare { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 1px; - background: var(--nc-border); - margin: 40px 0; - border: 1px solid var(--nc-border); -} - -.nc-compare-card { - background: var(--nc-bg); - padding: 28px; -} - -.nc-compare-card .label { - font-size: 10px; - letter-spacing: 0.15em; - text-transform: uppercase; - color: var(--nc-muted); +.nc-hero h1 { + font-size: clamp(36px, 6vw, 64px); margin-bottom: 16px; } -.nc-compare-card .old { - color: var(--nc-muted); - text-decoration: line-through; - font-size: 14px; - line-height: 1.7; +/* inline span — gradient on inline element so background-clip: text aligns with actual glyph ink, not line-height box */ +.nc-hero-title { + background: linear-gradient(135deg, var(--nc-gradient-from), var(--nc-gradient-to)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; } -.nc-compare-card .new { +/* nc-hero-tagline is a

— needs explicit font-family, does not inherit from h1-h6 rule */ +.nc-hero-tagline { + font-family: 'DM Serif Display', Georgia, serif; + font-size: clamp(26px, 4vw, 40px); color: var(--nc-text); - font-size: 14px; - line-height: 1.7; + margin-bottom: 20px; } -.nc-compare-card .new strong { +.nc-hero-tagline em { color: var(--nc-accent); + font-style: normal; } -/* ── Compare Grid: spaced variant (cards with gap) ── */ - -.nc-compare-spaced { - gap: 16px; - background: none; - border: none; +.nc-hero-desc { + font-size: 16px; + line-height: 1.9; + max-width: 560px; + margin: 0 auto 16px; } -.nc-compare-spaced .nc-compare-card { - background: var(--nc-surface); - border: 1px solid var(--nc-border); - padding: 24px; +.nc-hero-desc a { + color: var(--nc-accent); } -.nc-compare-card h4 { - font-size: 14px; - font-weight: 500; +.section-label { + font-size: 11px; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--nc-accent); margin-bottom: 16px; - letter-spacing: 0.02em; } -.nc-compare-card ul { - list-style: none; - padding: 0; +/* ── .nc-actions ── */ + +.nc-actions { display: flex; - flex-direction: column; - gap: 8px; + gap: 12px; + justify-content: center; + margin-top: 32px; + flex-wrap: wrap; } -.nc-compare-card li { +.nc-btn { + display: inline-block; + padding: 10px 24px; font-size: 14px; - color: var(--nc-muted); - padding-left: 18px; - position: relative; - line-height: 1.6; -} - -.nc-compare-card li::before { - content: "–"; - position: absolute; - left: 0; - color: var(--nc-border); + font-weight: 500; + letter-spacing: 0.02em; + color: var(--nc-bg); + background: var(--nc-accent); + text-decoration: none; + transition: background 0.2s, color 0.2s, border-color 0.2s, transform 0.15s; } -.nc-compare-highlight { - border-color: var(--nc-accent-border); - background: var(--nc-accent-dim); +.nc-btn:hover { + background: var(--nc-gradient-to); + transform: translateY(-1px); } -.nc-compare-highlight li { +.nc-btn-alt { + background: transparent; color: var(--nc-text); -} - -.nc-compare-highlight li::before { - content: "✓"; - color: var(--nc-accent); -} - -/* ── Diagram ── */ - -.nc-diagram { - margin: 40px 0; - padding: 32px; border: 1px solid var(--nc-border); - background: var(--nc-surface); -} - -.nc-diagram-label { - font-size: 11px; - letter-spacing: 0.1em; - text-transform: uppercase; - color: var(--nc-muted); - margin-bottom: 24px; -} - -.nc-diagram-row { - display: flex; - align-items: center; - gap: 16px; - margin-bottom: 12px; - font-size: 13px; } -.nc-diagram-row .arrow { +.nc-btn-alt:hover { + border-color: var(--nc-accent); color: var(--nc-accent); - flex-shrink: 0; -} - -.nc-diagram-row .concept { - color: var(--nc-text); -} - -.nc-diagram-row .desc { - color: var(--nc-muted); - font-size: 12px; + background: transparent; } -/* ── Closing Section ── */ +/* ── .nc-final ── */ .nc-final { max-width: 780px; @@ -473,9 +345,7 @@ h1, h2, h3, h4, h5, h6 { } .nc-final h2 { - font-family: 'DM Serif Display', Georgia, serif; font-size: clamp(28px, 4vw, 56px); - font-weight: 400; line-height: 1.15; max-width: 700px; margin: 0 auto 32px; @@ -495,6 +365,20 @@ h1, h2, h3, h4, h5, h6 { line-height: 1.9; } +.nc-final .signature { + margin-top: 64px; + font-size: 12px; + color: var(--nc-muted); + letter-spacing: 0.08em; +} + +.nc-final .signature a { + color: var(--nc-accent); + text-decoration: none; +} + +/* ── .nc-nav ── */ + .nc-nav { display: flex; justify-content: center; @@ -517,150 +401,126 @@ h1, h2, h3, h4, h5, h6 { border-bottom-color: var(--nc-accent); } -.nc-final .signature { - margin-top: 64px; - font-size: 12px; - color: var(--nc-muted); - letter-spacing: 0.08em; +/* ── .nc-quote ── */ + +.nc-quote { + border-left: 1px solid var(--nc-accent); + padding: 24px 32px; + margin: 40px 0; + background: var(--nc-accent-dim); } -.nc-final .signature a { +/* nc-quote children are

and

— need explicit font-family */ +.nc-quote p, +.nc-quote blockquote { + font-family: 'DM Serif Display', Georgia, serif; + font-size: clamp(18px, 2.5vw, 26px); + font-style: italic; color: var(--nc-accent); - text-decoration: none; + line-height: 1.5; + margin: 0; + border: none; + padding: 0; } -/* ── Footer ── */ +/* ── .nc-compare ── */ -.VPFooter { - border-top-color: var(--nc-border) !important; +.nc-compare { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1px; + background: var(--nc-border); + margin: 40px 0; + border: 1px solid var(--nc-border); } -/* ── Responsive ── */ - -@media (max-width: 640px) { - .nc-section { - padding: 60px 20px 0; - } - - .nc-compare { - grid-template-columns: 1fr; - } - - .nc-final { - padding: 72px 20px 0; - } - - .nc-hero { - padding: 60px 20px 48px; - } - - .nc-steps { - grid-template-columns: 1fr; - } - - .nc-usecases { - grid-template-columns: 1fr; - } +.nc-compare-spaced { + gap: 16px; + background: none; + border: none; +} - .nc-compare-spaced { - grid-template-columns: 1fr; - } +.nc-compare-card { + background: var(--nc-bg); + padding: 28px; } -/* ── Page Hero ── */ +.nc-compare-spaced .nc-compare-card { + background: var(--nc-surface); + border: 1px solid var(--nc-border); + padding: 24px; +} -.nc-hero { - text-align: center; - padding: 80px 24px 64px; - max-width: 780px; - margin: 0 auto; +.nc-compare-highlight { + background: var(--nc-accent-dim); + border-color: var(--nc-accent-border); } -.nc-hero h1 { - font-family: 'DM Serif Display', Georgia, serif; - font-size: clamp(36px, 6vw, 64px); - font-weight: 400; - letter-spacing: -0.02em; +.nc-compare-card .label { + font-size: 10px; + letter-spacing: 0.15em; + text-transform: uppercase; + color: var(--nc-muted); margin-bottom: 16px; - background: linear-gradient(135deg, var(--nc-gradient-from), var(--nc-gradient-to)); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; } -.nc-hero-tagline { - font-family: 'DM Serif Display', Georgia, serif; - font-size: clamp(26px, 4vw, 40px); - color: var(--nc-text); - margin-bottom: 20px; +.nc-compare-card h4 { + font-size: 14px; + font-weight: 500; + margin-bottom: 16px; + letter-spacing: 0.02em; } -.nc-hero-tagline em { - color: var(--nc-accent); - font-style: normal; +.nc-compare-card ul { + list-style: none; + padding: 0; + display: flex; + flex-direction: column; + gap: 8px; } -.nc-hero-desc { - font-size: 16px; - color: var(--vp-c-text-1); - line-height: 1.9; - max-width: 560px; - margin: 0 auto 16px; +.nc-compare-card li { + font-size: 14px; + color: var(--nc-muted); + padding-left: 18px; + position: relative; + line-height: 1.6; } -.nc-hero-desc a { - color: var(--nc-accent); +.nc-compare-card li::before { + content: "\u2013"; + position: absolute; + left: 0; + color: var(--nc-border); } -.section-label { - font-size: 11px; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--nc-accent); - margin-bottom: 16px; +.nc-compare-highlight li { + color: var(--nc-text); } -/* ── Buttons ── */ - -.nc-actions { - display: flex; - gap: 12px; - justify-content: center; - margin-top: 32px; - flex-wrap: wrap; +.nc-compare-highlight li::before { + content: "\u2713"; + color: var(--nc-accent); } -.nc-btn { - display: inline-block; - padding: 10px 24px; +.nc-compare-card .old { + color: var(--nc-muted); + text-decoration: line-through; font-size: 14px; - font-weight: 500; - letter-spacing: 0.02em; - color: var(--nc-bg); - background: var(--nc-accent); - text-decoration: none; - transition: background 0.2s, border-color 0.2s, color 0.2s, transform 0.15s; -} - -.nc-btn:hover { - background: var(--nc-gradient-to); - transform: translateY(-1px); + line-height: 1.7; } -.nc-btn-alt { - background: transparent; +.nc-compare-card .new { color: var(--nc-text); - border: 1px solid var(--nc-border); + font-size: 14px; + line-height: 1.7; } -.nc-btn-alt:hover { - border-color: var(--nc-accent); +.nc-compare-card .new strong { color: var(--nc-accent); - background: transparent; - transform: translateY(-1px); } -/* ── Steps (numbered cards) ── */ +/* ── .nc-steps ── */ .nc-steps { display: grid; @@ -689,9 +549,7 @@ h1, h2, h3, h4, h5, h6 { } .nc-step h3 { - font-family: 'DM Serif Display', Georgia, serif; font-size: 17px; - font-weight: 400; margin-bottom: 8px; } @@ -701,7 +559,7 @@ h1, h2, h3, h4, h5, h6 { line-height: 1.7; } -/* ── Use Case Cards ── */ +/* ── .nc-usecases ── */ .nc-usecases { display: grid; @@ -749,7 +607,46 @@ h1, h2, h3, h4, h5, h6 { color: var(--nc-muted); } -/* ── Prompt Box ── */ +/* ── .nc-diagram ── */ + +.nc-diagram { + margin: 40px 0; + padding: 32px; + border: 1px solid var(--nc-border); + background: var(--nc-surface); +} + +.nc-diagram-label { + font-size: 11px; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--nc-muted); + margin-bottom: 24px; +} + +.nc-diagram-row { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 12px; + font-size: 13px; +} + +.nc-diagram-row .arrow { + color: var(--nc-accent); + flex-shrink: 0; +} + +.nc-diagram-row .concept { + color: var(--nc-text); +} + +.nc-diagram-row .desc { + color: var(--nc-muted); + font-size: 12px; +} + +/* ── .nc-prompt-box ── */ .nc-prompt-box { background: var(--nc-surface); @@ -774,19 +671,19 @@ h1, h2, h3, h4, h5, h6 { } .nc-prompt-path { - color: var(--nc-accent); display: block; + color: var(--nc-accent); } .nc-prompt-footer { padding: 16px 24px; border-top: 1px solid var(--nc-border); background: var(--nc-bg); + font-size: 13px; + color: var(--nc-muted); } .nc-prompt-footer p { - font-size: 13px; - color: var(--nc-muted); margin: 0; } @@ -794,31 +691,25 @@ h1, h2, h3, h4, h5, h6 { color: var(--nc-text); } -/* ── CTA Section ── */ +/* ── Responsive ── */ -.nc-cta { - max-width: 780px; - margin: 0 auto; - padding: 80px 24px; - text-align: center; - border-top: 1px solid var(--nc-border); -} +@media (max-width: 640px) { + .nc-section { + padding: 60px 20px 0; + } -.nc-cta h2 { - font-family: 'DM Serif Display', Georgia, serif; - font-size: clamp(24px, 4vw, 36px); - font-weight: 400; - margin-bottom: 12px; - border: none; - padding: 0; -} + .nc-hero { + padding: 60px 20px 48px; + } -.nc-cta a { - color: var(--nc-accent); -} + .nc-final { + padding: 72px 20px 0; + } -.nc-cta p { - color: var(--nc-muted); - font-size: 15px; + .nc-compare, + .nc-compare-spaced, + .nc-steps, + .nc-usecases { + grid-template-columns: 1fr; + } } - diff --git a/thinking/ai-native-sdlc.md b/thinking/ai-native-sdlc.md index 2376f84..cf73095 100644 --- a/thinking/ai-native-sdlc.md +++ b/thinking/ai-native-sdlc.md @@ -3,10 +3,10 @@ layout: page title: What's left when development is autonomous. --- -
- -

What's left when development is autonomous.

-
+ + + +

Assume the agent handles implementation. Another agent handles operations — Terraform, Kubernetes, configuration, deployment. Both are nearly there today. In 1–2 years, close enough.

@@ -59,7 +59,7 @@ title: What's left when development is autonomous.

An agent doesn't need a ticket system. It needs a signal. It doesn't need a sprint. It needs a priority function. It doesn't need a PR. It needs a verification gate.

-

"Fix your fucking processes. Then automate them."

+

"Fix your processes. Then automate them."

The sequence matters. AI on top of broken processes doesn't produce better software faster. It produces broken software faster.

diff --git a/thinking/terminal-cycle.md b/thinking/terminal-cycle.md index 9336749..41f71b7 100644 --- a/thinking/terminal-cycle.md +++ b/thinking/terminal-cycle.md @@ -3,10 +3,10 @@ layout: page title: The terminal never left. --- -
- -

The terminal never left.

-
+ + + +

We spent 40 years building abstractions on top of the command line.

From 3c4c7d618bbf2c358f253a1591ff4ee87b9c528d Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sat, 21 Mar 2026 20:28:57 +0100 Subject: [PATCH 14/23] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20migrate?= =?UTF-8?q?=20homepage=20hero=20to=20NcHero=20and=20sharpen=20section=20co?= =?UTF-8?q?ntent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/index.md b/index.md index 2ff3ddf..ec3842c 100644 --- a/index.md +++ b/index.md @@ -3,8 +3,8 @@ layout: home hero: name: "Martin Haberfellner" - text: "LLMs don't follow instructions. They resonate with fields." - tagline: Fix the processes, not the symptoms. 25 years. Now with AI. + text: "LLMs don't follow instructions. They resonate with fields." + tagline: The field is always there. The question is whether you designed it. actions: - theme: brand text: Behaviour Priming @@ -33,7 +33,7 @@ hero:

02 — The Discovery

Every prompt creates a field. The question is whether you designed it.

-

The model doesn't read a prompt and execute it. It enters a semantic space. That space shapes every response that follows. User input doesn't drive the model. It creates interference in the field. The model responds to the interference from within the field.

+

The model doesn't read a prompt and execute it. It enters a semantic space — not metaphorically, but mechanically: a field of activation patterns, tensions, and forces, the way a physical field shapes what moves through it. That space shapes every response that follows. User input doesn't drive the model. It creates interference in the field. The model responds to the interference from within the field.

This is not a choice between instructions and fields. Fields always emerge. An instruction-based prompt creates one too — accidental, noisy, unstable. The instructions are just the debris the field is built from. It often works. But it drifts. It breaks under unexpected input. It costs more than it should.

@@ -68,11 +68,11 @@ hero:

04 — Consequences

-

Why the industry still gets this wrong.

-

Most prompt engineering is software engineering wearing a different hat. Deterministic thinking applied to a probabilistic system. Define every step. Anticipate every case. Control every output.

+

Most prompt engineering is software engineering wearing a different hat.

+

Deterministic thinking applied to a probabilistic system. Define every step. Anticipate every case. Control every output.

This suppresses exactly what makes LLMs powerful: emergent understanding, implicit knowledge, contextual judgment. The more you over-specify, the more you undermine the model.

-

Multi-agent systems do the same. One LLM prompting another — imitating how a human explains something to a less experienced human. Step by step. Spelled out. As if the other model doesn't already carry the same implicit knowledge. Two experts talking like one of them is a beginner.

-

The pattern is everywhere. AI in human workflows. AI in development pipelines. The host thinks. The subagent executes. Nobody asks why the subagent isn't trusted to think.

+

Multi-agent systems follow the same pattern. One LLM prompting another — imitating how a human explains something to a less experienced human. Step by step. Spelled out. As if the other model doesn't already carry the same implicit knowledge. Two experts talking like one of them is a beginner.

+

The pattern is everywhere. AI in human workflows. AI in development pipelines. The host thinks. The subagent executes. The question worth asking: why isn't the subagent trusted to think?

"Frame. Goal. Trust. The model finds the path. That's not vague — that's accurate."

@@ -115,8 +115,9 @@ hero:
-

The question nobody was asking was the only one that mattered.

+

Once you see the field, you can't unsee it.

This is not a framework. It's not a methodology to adopt. It's a shift in how you see the thing. Once you see it, the prompts write themselves differently. The results hold differently. The drift disappears.

+

See for yourself

From eff6b8ec349de6772c186b15d87be7a31493a879 Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sat, 21 Mar 2026 20:29:07 +0100 Subject: [PATCH 15/23] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20migrate?= =?UTF-8?q?=20martin-haberfellner=20page=20hero=20to=20NcHero=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- martin-haberfellner.md | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/martin-haberfellner.md b/martin-haberfellner.md index 4d26a3f..9da89b4 100644 --- a/martin-haberfellner.md +++ b/martin-haberfellner.md @@ -3,16 +3,15 @@ layout: page title: Martin Haberfellner --- -
- -

Martin Haberfellner

-

I build the system behind the system.

-
+ + + +
-

For 25 years — across platforms, teams, and now AI — the interesting problem was never the feature. It was always what made the feature possible, sustainable, and worth building in the first place.

-

Currently at Tietoevry, where AI is everything I do: strategy, adoption, assessment, integration into the SDLC. The work is always the same: find the waste, build the right foundation, let things flow.

-

Active in the field. Thinking out loud here.

+

The conversation always goes the same way. Someone explains the problem. I ask what's one level deeper. The answer is always there.

+

Across platforms, teams, and now AI — the interesting problem is never the feature. It was always what made the feature possible, sustainable, and worth building in the first place.

+

The work is always the same: find the waste, build the right foundation, let things flow.

@@ -26,7 +25,7 @@ title: Martin Haberfellner

Lean → DevOps Maturity → AI Maturity. In that order.

-

Buying everyone a better editor has never helped anyone. Giving everyone Copilot doesn't either — until the processes underneath are worth accelerating. AI amplifies what's already there. Chaos and excellence equally.

+

Buying everyone the world's best editor has never helped anyone. Giving everyone Copilot doesn't either — until the processes underneath are worth accelerating. AI amplifies what's already there. Chaos and excellence equally.

@@ -52,9 +51,6 @@ title: Martin Haberfellner
-

Currently

-

AI strategy and adoption in enterprise software development.

-

Specifically: how to integrate AI into the SDLC in a way that isn't just faster — but structurally different. What does a development process look like when autonomous agents handle execution? What's the loop that remains?

-

Building Behaviour Priming — a method for giving LLMs a disposition instead of a script. Testing it in the open via proto.labs.

-

Thinking out loud in /thinking.

+

By the way.

+

If you ever need a votable Quake 3 server or a working stats tool — strikenet.com has been running since 1999. I bought the domain from my first employer when I left. The server still runs. The stats tool is dockerized and occasionally gets a fix. Some things are worth keeping alive.

From 2af847a0f2e82fe9ce5542b08a85f0927be3bf00 Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sat, 21 Mar 2026 20:29:28 +0100 Subject: [PATCH 16/23] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20simplify?= =?UTF-8?q?=20and=20condense=20behaviour=20priming=20hero=20section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- behaviour.priming/index.md | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/behaviour.priming/index.md b/behaviour.priming/index.md index 1704670..479b57e 100644 --- a/behaviour.priming/index.md +++ b/behaviour.priming/index.md @@ -5,7 +5,7 @@ title: //behaviour.priming hero: name: "//behaviour:priming" text: "Let the LLM do the thinking." - tagline: "Stop writing workflows. Define how your AI should behave and what outcome you need — then let it find the best path on its own." + tagline: "Prime the behaviour. Let go." actions: - theme: alt text: See the Minimal Prompt @@ -17,7 +17,7 @@ hero:

01 — Method

-

Prime the behaviour. Define the outcome. Let go.

+

Set the stage. The model finds the play.

Instead of scripting every step, you set the stage. Two inputs. One autonomous agent.

@@ -39,7 +39,7 @@ hero:
-

02 — Why it works

+

02 — Principle, not procedure

Delegate the path. Keep the standards.

Behaviour Priming replaces procedures with principles, decision rules, and verification gates. You delegate the path — but keep the standards. Unlike role-prompting, you're not assigning a character. You're encoding a decision-making framework.

@@ -100,7 +100,7 @@ hero:
-
+
A cast with scripts performs. Characters with depth find the play.
@@ -118,7 +118,7 @@ hero:
behaviour-priming.prompt.md
-
Behaviour: Act as Bob Moesta. Conduct a Jobs-to-be-Done interview.

Outcome:
- jobs/{name}.md
- .github/prompts/{name}.prompt.md
+
Behaviour: Act as Bob Moesta. Conduct a Jobs-to-be-Done interview.

Outcome:
- jobs/{name}.md- .github/prompts/{name}.prompt.md
@@ -128,7 +128,7 @@ hero:

06 — Go Deeper

When the behaviour is designed.

-

Intentional redundancy. Overlapping phrasing stabilizes behaviour and reduces drift across long sessions. The charged prompt looks long — it might look badly written. That's by design. Each phrase is a behaviour instruction. Each section tunes a specific response pattern. The LLM isn't told what to do. It's shaped into something that strongly biases the model toward the behaviour you need.

+

A charged prompt isn't written phrase by phrase — it's compiled from intent. Intentional redundancy. Overlapping phrasing stabilizes behaviour and reduces drift across long sessions. The charged prompt looks long — it might look badly written. That's by design. Each phrase is a behaviour instruction. Each section tunes a specific response pattern. The LLM isn't told what to do. It's shaped into something that strongly biases the model toward the behaviour you need.

@@ -175,15 +175,8 @@ Both work. This one works harder.
-
+

Try it yourself on //prompt.forge

Submit a real use case. Get a prompt built with Behaviour Priming.

-
-

Context

-

Why this method exists.

-

Behaviour Priming didn't start as a framework. It started as a question: if an LLM doesn't truly understand intent, why does it follow instructions at all — and why does it sometimes fail? The method is the answer to that question, developed in practice.

-

The same thinking that led here — fix the process, not the symptom; structure before speed; the system behind the system — runs through everything built on this site. More about that.

-

See how this thinking extends beyond prompting, into AI-native development and what comes after the SDLC: /thinking.

-
From 2e105f912ff4417f385290a5e4009f329ba808c9 Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sat, 21 Mar 2026 20:30:05 +0100 Subject: [PATCH 17/23] =?UTF-8?q?docs:=20=E2=9C=8F=EF=B8=8F=20update=20pro?= =?UTF-8?q?mpt.forge=20hero=20text=20and=20tagline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prompt.forge/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/prompt.forge/index.md b/prompt.forge/index.md index 41079db..8756d17 100644 --- a/prompt.forge/index.md +++ b/prompt.forge/index.md @@ -3,8 +3,8 @@ layout: home hero: name: "//prompt.forge" - text: "Your job. My method. Better prompt." - tagline: Submit a real use case – I'll show you what Behaviour Priming can do. + text: "Send me your prompt. I'll rebuild it." + tagline: I want to know if Behaviour Priming works for you the way it works for me. You test both. You decide. actions: - theme: brand text: Join the Experiment @@ -22,7 +22,7 @@ hero: 1. Use the **[Job-to-be-Done interview prompt](/proto.labs/job-to-be-done)** to document what you're trying to accomplish 2. The interview generates a baseline prompt tailored to your job -3. Submit your job via GitHub — I'll create an improved version using Behaviour Priming +3. Submit your job via GitHub — I'll run the compiler: your intent goes in, a semantically charged prompt comes out 4. Test both, share what works better **→ [Join the Experiment on GitHub](https://github.com/evilru/prompt.forge)** From e0ee3f64d051ef11a53cf56cc548f3ec899d3b24 Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sat, 21 Mar 2026 20:30:19 +0100 Subject: [PATCH 18/23] =?UTF-8?q?docs:=20=E2=9C=8F=EF=B8=8F=20update=20lea?= =?UTF-8?q?rning=20zone=20mode=20page=20tagline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proto.labs/learning-zone-mode.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proto.labs/learning-zone-mode.md b/proto.labs/learning-zone-mode.md index 4a9c1a2..6f7845c 100644 --- a/proto.labs/learning-zone-mode.md +++ b/proto.labs/learning-zone-mode.md @@ -4,7 +4,7 @@ layout: home hero: name: "Learning Zone" text: "AI can make you lazy." - tagline: This prompt turns your AI into a teacher. You build understanding — not just collect answers. + tagline: What if it asked instead of answered? actions: - theme: brand text: Activate Learning Zone @@ -22,7 +22,7 @@ It detects where you are and adjusts its teaching style accordingly: - **Learning Zone** → Guides discovery with frameworks and reasoning - **Panic Zone** → Scaffolds down with clear structure and examples -This maps to Vygotsky's [Zone of Proximal Development](https://en.wikipedia.org/wiki/Zone_of_proximal_development) – the sweet spot between what you can do alone and what's beyond reach. Instead of ready-made solutions, you build understanding. +This maps to Senninger's three-zone model — built on Vygotsky's [Zone of Proximal Development](https://en.wikipedia.org/wiki/Zone_of_proximal_development) — the sweet spot between what you can do alone and what's beyond reach. Instead of ready-made solutions, you build understanding. ## Share Your Experience From 34ae36b96d0309dfabfc176a996b23de4372338e Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sun, 22 Mar 2026 17:55:52 +0100 Subject: [PATCH 19/23] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20tighten?= =?UTF-8?q?=20content=20and=20navigation=20across=20all=20main=20pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/config.mts | 2 +- behaviour.priming/index.md | 4 ++-- index.md | 6 +++--- martin-haberfellner.md | 4 ++-- proto.labs/index.md | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 8ca6ef0..fa6e817 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -73,7 +73,7 @@ export default defineConfig({ }, nav: [ { text: '//behaviour.priming', link: '/behaviour.priming/index.md' }, - { text: '//thinking', link: '/thinking/index.md' }, + // { text: '//thinking', link: '/thinking/index.md' }, { text: '//proto.labs', link: '/proto.labs/index.md' }, { text: '//prompt.forge', link: '/prompt.forge/index.md' }, ], diff --git a/behaviour.priming/index.md b/behaviour.priming/index.md index 479b57e..c542c89 100644 --- a/behaviour.priming/index.md +++ b/behaviour.priming/index.md @@ -98,11 +98,11 @@ hero:
-
-
A cast with scripts performs. Characters with depth find the play.
+

A cast with scripts performs. Characters with depth find the play.

+

04 — The Spectrum

diff --git a/index.md b/index.md index ec3842c..85326a0 100644 --- a/index.md +++ b/index.md @@ -66,7 +66,7 @@ hero:

When a prompt is semantically saturated, adding more concepts changes nothing. That's not a limitation. That's the signal that the field is complete.

-
+
-

05 — Method

+

04 — Method

Behaviour Priming. Not programming. Activating.

The capability is already there. Every LLM has absorbed how interviews work. How coaching works. How a Socratic conversation feels. How to hold space. How to push back gently. How to recognize when someone is overwhelmed.

It's in the training data — everywhere, implicit, deep. You don't teach it. You prime it.

diff --git a/martin-haberfellner.md b/martin-haberfellner.md index 9da89b4..b8535d6 100644 --- a/martin-haberfellner.md +++ b/martin-haberfellner.md @@ -50,7 +50,7 @@ title: Martin Haberfellner
-
+

By the way.

If you ever need a votable Quake 3 server or a working stats tool — strikenet.com has been running since 1999. I bought the domain from my first employer when I left. The server still runs. The stats tool is dockerized and occasionally gets a fix. Some things are worth keeping alive.

-
+
\ No newline at end of file diff --git a/proto.labs/index.md b/proto.labs/index.md index 86d6460..0695f15 100644 --- a/proto.labs/index.md +++ b/proto.labs/index.md @@ -35,7 +35,7 @@ AI can make you lazy. Copy-paste solutions without understanding. This prompt ap **Want a custom prompt?** Submit your use case via **[//prompt.forge](/prompt.forge/)** — I'll build one using Behaviour Priming. -## Related + From 75f0a6b3bcc2df937b562d571f749b5c60b5ff38 Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sun, 22 Mar 2026 17:57:20 +0100 Subject: [PATCH 20/23] =?UTF-8?q?feat:=20=F0=9F=9A=A7=20add=20limits=20sec?= =?UTF-8?q?tion=20placeholder=20to=20behaviour=20priming?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- behaviour.priming/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/behaviour.priming/index.md b/behaviour.priming/index.md index c542c89..41d4e73 100644 --- a/behaviour.priming/index.md +++ b/behaviour.priming/index.md @@ -146,6 +146,7 @@ Both work. This one works harder.
+

Try it yourself on //prompt.forge

From 555755c39c3ce332cc6975c320b4bf4f4d5eb2dd Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sun, 22 Mar 2026 18:33:50 +0100 Subject: [PATCH 21/23] =?UTF-8?q?feat(skills):=20=E2=9C=A8=20add=20commit?= =?UTF-8?q?=20skill=20with=20gitmoji=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds SKILL.md for creating conventional commits with mandatory gitmoji, optional scope, required body, and interactive confirmation via fixed choices. Includes full gitmoji reference table in references/gitmoji.md. --- .github/skills/commit/SKILL.md | 28 +++++++ .github/skills/commit/references/gitmoji.md | 81 +++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 .github/skills/commit/SKILL.md create mode 100644 .github/skills/commit/references/gitmoji.md diff --git a/.github/skills/commit/SKILL.md b/.github/skills/commit/SKILL.md new file mode 100644 index 0000000..ce3498b --- /dev/null +++ b/.github/skills/commit/SKILL.md @@ -0,0 +1,28 @@ +--- +name: commit +description: 'Create and commit a conventional commit message. Use when files are staged and ready to commit, or when formatting a git commit with type, scope, subject, body, and ticket reference.' +argument-hint: 'optional scope or ticket override' +--- + +# Create Conventional Commit + +## Format + +``` +type(scope): ✨ subject + +body +``` + +- Gitmoji is **mandatory** — real emoji after `type(scope): `, not `:name:` syntax +- Pick the **most specific** one from [gitmoji reference](./references/gitmoji.md) +- Scope is optional +- Body is **mandatory** — summarize what changed and why + +## Steps + +1. Run `git status --porcelain --branch`, `git --no-pager diff --name-status --staged`, `git --no-pager diff --staged` +2. Flag unstaged changes that touch staged files — ask before proceeding if staging looks wrong +3. Infer type, scope, and gitmoji — ask only if type is genuinely ambiguous +4. Show the full message in a code block +5. Ask for confirmation with three fixed choices: **Commit** / **Cancel** / **Edit message** (no freeform input) — only run `git commit` if the user confirms \ No newline at end of file diff --git a/.github/skills/commit/references/gitmoji.md b/.github/skills/commit/references/gitmoji.md new file mode 100644 index 0000000..a25d719 --- /dev/null +++ b/.github/skills/commit/references/gitmoji.md @@ -0,0 +1,81 @@ +# Gitmoji Reference + +Pick the **most specific** emoji that matches the actual change. Do not default to the generic type emoji when a more precise one applies. + +| emoji | when to use | +|-------|-------------| +| ✨ | introduce new features | +| 🐛 | fix a bug | +| 🚑️ | critical hotfix | +| 🩹 | simple fix for a non-critical issue | +| 🔒️ | fix security or privacy issues | +| 💥 | introduce breaking changes | +| ⏪️ | revert changes | +| 📝 | add or update documentation | +| 💡 | add or update comments in source code | +| 💬 | add or update text and literals | +| ✏️ | fix typos | +| 🎨 | improve structure or format of code | +| ♻️ | refactor code | +| 🏗️ | make architectural changes | +| ⚡️ | improve performance | +| 🔥 | remove code or files | +| ⚰️ | remove dead code | +| 🗑️ | deprecate code that needs to be cleaned up | +| 💄 | add or update UI and style files | +| 🚸 | improve user experience / usability | +| ♿️ | improve accessibility | +| 📱 | work on responsive design | +| 💫 | add or update animations and transitions | +| 🍱 | add or update assets | +| 🌐 | internationalization and localization | +| 🔍️ | improve SEO | +| ✅ | add, update, or pass tests | +| 🧪 | add a failing test | +| 📸 | add or update snapshots | +| 🔧 | add or update configuration files | +| 🔨 | add or update development scripts | +| 📦️ | add or update compiled files or packages | +| ➕ | add a dependency | +| ➖ | remove a dependency | +| ⬆️ | upgrade dependencies | +| ⬇️ | downgrade dependencies | +| 📌 | pin dependencies to specific versions | +| 👷 | add or update CI build system | +| 💚 | fix CI build | +| 🚨 | fix compiler / linter warnings | +| 🚧 | work in progress | +| 🏷️ | add or update types | +| 🌱 | add or update seed files | +| 🗃️ | perform database related changes | +| 🧱 | infrastructure related changes | +| 🛂 | authorization, roles and permissions | +| 🦺 | add or update validation | +| 🥅 | catch errors | +| 🔊 | add or update logs | +| 🔇 | remove logs | +| 📈 | add or update analytics or tracking | +| 🚩 | add, update, or remove feature flags | +| 👔 | add or update business logic | +| 🩺 | add or update healthcheck | +| 🧑‍💻 | improve developer experience | +| 🔐 | add or update secrets | +| 🔖 | release / version tags | +| 🚀 | deploy stuff | +| 🎉 | begin a project | +| 👽️ | update code due to external API changes | +| 🚚 | move or rename resources | +| 📄 | add or update license | +| 🙈 | add or update .gitignore | +| 👥 | add or update contributors | +| ⚗️ | perform experiments | +| 🤡 | mock things | +| 🧐 | data exploration / inspection | +| 🧵 | multithreading or concurrency | +| 💸 | sponsorships or money-related infrastructure | +| ✈️ | improve offline support | +| 🦖 | add backwards compatibility | +| 🥚 | add or update an easter egg | +| 💩 | write bad code that needs to be improved | +| 🍻 | write code drunkenly | +| 🔀 | merge branches | From ae65014e0983c1bc619df475f059bf84d3bb269b Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sun, 22 Mar 2026 18:46:25 +0100 Subject: [PATCH 22/23] =?UTF-8?q?docs(skills):=20=F0=9F=93=9D=20update=20c?= =?UTF-8?q?ommit=20skill=20description=20and=20confirmation=20step?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated description to be trigger-friendly — applies whenever the user mentions committing, not only when files are already staged. Step 5 now explicitly references the interactive question tool for confirmation. --- .github/skills/commit/SKILL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/skills/commit/SKILL.md b/.github/skills/commit/SKILL.md index ce3498b..a966179 100644 --- a/.github/skills/commit/SKILL.md +++ b/.github/skills/commit/SKILL.md @@ -1,6 +1,6 @@ --- name: commit -description: 'Create and commit a conventional commit message. Use when files are staged and ready to commit, or when formatting a git commit with type, scope, subject, body, and ticket reference.' +description: Create and execute a conventional commit with gitmoji. Use whenever the user wants to commit, mentions committing, staging changes, or asks to save/record work in git — even if they don't say "staged" explicitly. argument-hint: 'optional scope or ticket override' --- @@ -25,4 +25,4 @@ body 2. Flag unstaged changes that touch staged files — ask before proceeding if staging looks wrong 3. Infer type, scope, and gitmoji — ask only if type is genuinely ambiguous 4. Show the full message in a code block -5. Ask for confirmation with three fixed choices: **Commit** / **Cancel** / **Edit message** (no freeform input) — only run `git commit` if the user confirms \ No newline at end of file +5. Use an interactive question tool to ask for confirmation with three fixed choices: **Commit** / **Cancel** / **Edit message** — only run `git commit` if the user confirms \ No newline at end of file From ce9e82513e84459c0ff23a19beeed8ceafa6fa3b Mon Sep 17 00:00:00 2001 From: Martin Haberfellner Date: Sun, 22 Mar 2026 18:47:12 +0100 Subject: [PATCH 23/23] =?UTF-8?q?docs(releasenotes):=20=F0=9F=93=9D=20add?= =?UTF-8?q?=20behaviour-priming=20launch=20release=20note?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Covers new //behaviour.priming section, martin-haberfellner profile page, commit skill with gitmoji reference, navigation updates, and site identity overhaul (dark mode, DM Mono, title change). --- ...viour-priming-launch-cf66848e63ce5925.yaml | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 releasenotes/notes/behaviour-priming-launch-cf66848e63ce5925.yaml diff --git a/releasenotes/notes/behaviour-priming-launch-cf66848e63ce5925.yaml b/releasenotes/notes/behaviour-priming-launch-cf66848e63ce5925.yaml new file mode 100644 index 0000000..135ecaa --- /dev/null +++ b/releasenotes/notes/behaviour-priming-launch-cf66848e63ce5925.yaml @@ -0,0 +1,34 @@ +--- +prelude: > + Behaviour Priming is now a first-class section of the site. The concept + moves from a single proto.labs experiment to a dedicated top-level area + with its own page, navigation entry, and editorial voice. The site visual + identity has been overhauled to match: dark mode, DM Mono typography. + VitePress sample content has been removed entirely. +features: + - | + New top-level section //behaviour.priming with its own index page, + hero, context explanation, and a placeholder for the upcoming Limits + section. The page introduces Behaviour Priming as a method, explains + its origins, and links to related thinking. + - | + New martin-haberfellner.md profile page introducing Martin Haberfellner + with personal principles and current focus on AI-native delivery. + - | + New commit skill (.github/skills/commit/) for creating conventional + commits with mandatory gitmoji, optional scope, required body, and + interactive confirmation. Includes a full gitmoji reference table + (references/gitmoji.md) sourced from gitmoji.dev. +other: + - | + VitePress boilerplate files (api-examples.md, markdown-examples.md) + removed from the repository. + - | + Navigation updated: //behaviour.priming added as top-level nav entry. + Redundant "Overview" sidebar items removed. Footer links cleaned up. + - | + Site title changed to "NEONCODE!", description and all meta/OG/Twitter + tags updated to reflect the Behaviour Priming positioning. + - | + HTML drafts for behaviour-priming and the prompt.forge manifest moved + into the draft/ folder and excluded from the VitePress build.