@medicine-wheel/creative-orientation 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # @medicine-wheel/creative-orientation
2
+
3
+ Which orientation does this situation call for?
4
+
5
+ > [!WARNING]
6
+ > **Experimental alpha.** Part of the Medicine Wheel Developer Suite, which is
7
+ > under active development. APIs change between patch versions and all packages
8
+ > move in lockstep — pin exact versions. See
9
+ > [ALPHA.md](https://github.com/jgwill/medicine-wheel/blob/main/ALPHA.md).
10
+
11
+ ## Why it exists
12
+
13
+ Problem-solving is not the degraded case. It is the **correct** case for a
14
+ specific situation: something worked, it stopped working, restore it. Creating
15
+ is correct for a different one: bring into being a state that has never
16
+ existed.
17
+
18
+ They produce different structures. Problem-solving oscillates back to a
19
+ baseline — which is exactly right when you are below the baseline. Creating
20
+ advances toward an outcome. Using the wrong one is how rigorous work goes in
21
+ circles: chart an oscillating goal and you build a very careful machine for
22
+ returning to where you started.
23
+
24
+ This package answers the routing question and nothing else.
25
+
26
+ ## The discriminator
27
+
28
+ A feeling of urgency is not evidence. Under pressure every situation feels like
29
+ a fire. One question separates them:
30
+
31
+ > **Is there a prior state you are restoring?**
32
+
33
+ If you can name it and it genuinely existed — fire. Gap analysis is the right
34
+ instrument. If you cannot, you are creating, and difference-closing language
35
+ will mislead you, because there is no baseline to close toward.
36
+
37
+ ## Usage
38
+
39
+ ```ts
40
+ import { readOrientation, worthSaying } from '@medicine-wheel/creative-orientation';
41
+
42
+ const reading = readOrientation({
43
+ outcome: 'catch cross-service contract breaks',
44
+ restores: null,
45
+ });
46
+
47
+ reading.orientation; // 'advancing'
48
+ reading.route; // 'structural-tension'
49
+ worthSaying(reading); // true — the phrasing and the situation disagree
50
+ reading.advice;
51
+ // "This outcome is phrased as removing something, but nothing is being
52
+ // restored. Elimination framing here optimises against a list of known
53
+ // failures rather than toward the state you actually want."
54
+ ```
55
+
56
+ The baseline claim decides the route. Vocabulary only ever contributes signals,
57
+ because `reduce latency` is a correct outcome during an incident and a symptom
58
+ worth surfacing as a product vision. A blocklist would be wrong in precisely
59
+ the situation where that vocabulary is right.
60
+
61
+ ## It advises; it does not refuse
62
+
63
+ Nothing here blocks a caller. A package that refuses is a package people learn
64
+ to route around, and routing around it teaches nothing. The reading is
65
+ returned, the disagreement is named, and the caller proceeds — because
66
+ sometimes the caller knows something the check does not.
67
+
68
+ ## Where it sits
69
+
70
+ ```
71
+ creative-orientation ......... the gate
72
+ ├── gap-analysis ......... the fire path
73
+ └── structural-tension ... the advancing path
74
+ ```
75
+
76
+ `@medicine-wheel/brainstorming` calls this on every outcome statement it emits,
77
+ including its own questions. That is the load-bearing use: an elimination-shaped
78
+ option label, once selected by a human, stops looking like an agent's bias and
79
+ starts looking like a requirement.
80
+
81
+ ## Status
82
+
83
+ First release. The surface is small on purpose — the judgement of whether a
84
+ claimed baseline is *real* stays with a person, and everything around that
85
+ socket is deterministic so it can be tested and cannot be forgotten under load.
86
+
87
+ ## License
88
+
89
+ MIT
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @medicine-wheel/creative-orientation
3
+ *
4
+ * Which orientation does this situation call for?
5
+ *
6
+ * Problem-solving is not the degraded case. It is the correct case for a
7
+ * specific situation: something worked, it stopped working, restore it.
8
+ * Creating is the correct case for a different one: bring into being a state
9
+ * that has never existed. They produce different structures — one oscillates
10
+ * back to a baseline, one advances toward an outcome — and using the wrong
11
+ * one is how rigorous work goes in circles.
12
+ *
13
+ * This module answers the routing question and nothing else. It does not
14
+ * decide, it does not block. A caller that disagrees proceeds, because
15
+ * sometimes the caller knows something the check does not.
16
+ *
17
+ * @packageDocumentation
18
+ */
19
+ /**
20
+ * The one question that separates the two orientations.
21
+ *
22
+ * A feeling of urgency is not evidence — under pressure everything feels like
23
+ * a fire. What distinguishes them is whether there is a prior state you are
24
+ * returning to. If you can name it and it genuinely existed, the situation is
25
+ * a fire. If you cannot, you are creating, and difference-closing language
26
+ * will mislead you because there is no baseline to close toward.
27
+ */
28
+ export interface SituationClaim {
29
+ /** What the caller wants. */
30
+ outcome: string;
31
+ /**
32
+ * The prior state being restored, if any. A string means the caller claims
33
+ * one existed; `null` means they claim none did.
34
+ */
35
+ restores: string | null;
36
+ /** Optional evidence that the claimed prior state was real. */
37
+ evidence?: string;
38
+ }
39
+ export type Orientation = 'advancing' | 'oscillating' | 'ambiguous';
40
+ export type Route = 'gap-analysis' | 'structural-tension';
41
+ export interface OrientationSignal {
42
+ kind: 'vocabulary' | 'baseline' | 'outcome-shape';
43
+ detail: string;
44
+ /** Which orientation this signal points toward. */
45
+ suggests: Orientation;
46
+ }
47
+ export interface OrientationReading {
48
+ orientation: Orientation;
49
+ /** Where this situation should be taken next. */
50
+ route: Route;
51
+ signals: OrientationSignal[];
52
+ /**
53
+ * Present when the reading disagrees with how the outcome was phrased.
54
+ * Advisory — never a refusal.
55
+ */
56
+ advice?: string;
57
+ /** The outcome restated in advancing form, when that is what is called for. */
58
+ suggestedOutcome?: string;
59
+ }
60
+ /**
61
+ * Words that describe the removal of something unwanted rather than the
62
+ * presence of something wanted.
63
+ *
64
+ * These are **evidence, not verdicts**. "Reduce latency" is a correct outcome
65
+ * when the forest is on fire. The same phrase as a product vision is a symptom
66
+ * worth surfacing. A blocklist would be wrong in exactly the situation where
67
+ * this vocabulary is right.
68
+ */
69
+ export declare const ELIMINATION_MARKERS: readonly ["avoid", "prevent", "reduce", "eliminate", "stop", "fix", "catch", "remove", "minimize", "minimise", "mitigate", "resolve the problem", "get rid of", "bridge the gap", "close the gap", "gap between"];
70
+ /** Words that describe a state coming into being. */
71
+ export declare const ADVANCING_MARKERS: readonly ["bring into being", "establish", "create", "arrives", "exists", "becomes", "holds", "carries", "is able to", "can now"];
72
+ /**
73
+ * Read a situation and say which orientation it calls for.
74
+ *
75
+ * The baseline claim decides the route; vocabulary only ever contributes
76
+ * signals. A caller who names a real prior state gets routed to gap analysis
77
+ * even if they phrased the outcome beautifully — and a caller who names none
78
+ * gets routed to structural tension even if every word they used was
79
+ * elimination-shaped.
80
+ */
81
+ export declare function readOrientation(claim: SituationClaim): OrientationReading;
82
+ /**
83
+ * Restate an elimination-shaped outcome as a desired state.
84
+ *
85
+ * Deliberately mechanical and deliberately incomplete: it produces a prompt for
86
+ * a human or agent to finish, not a finished sentence. A confident rewrite here
87
+ * would be a machine deciding what someone wants.
88
+ */
89
+ export declare function reorient(outcome: string): string;
90
+ /** Convenience: the route alone, for callers that only need to dispatch. */
91
+ export declare function routeFor(claim: SituationClaim): Route;
92
+ /**
93
+ * Does this reading warrant interrupting the caller?
94
+ *
95
+ * True only when the orientation and the phrasing disagree. Advice on a
96
+ * situation the caller already framed correctly is noise, and noise is how
97
+ * checks get switched off.
98
+ */
99
+ export declare function worthSaying(reading: OrientationReading): boolean;
100
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,WAAW,CAAC;AAEpE,MAAM,MAAM,KAAK,GAAG,cAAc,GAAG,oBAAoB,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,eAAe,CAAC;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,QAAQ,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,iDAAiD;IACjD,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,mNAItB,CAAC;AAEX,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,mIAGpB,CAAC;AAYX;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,kBAAkB,CAwDzE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,KAAK,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAEhE"}
package/dist/index.js ADDED
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ /**
3
+ * @medicine-wheel/creative-orientation
4
+ *
5
+ * Which orientation does this situation call for?
6
+ *
7
+ * Problem-solving is not the degraded case. It is the correct case for a
8
+ * specific situation: something worked, it stopped working, restore it.
9
+ * Creating is the correct case for a different one: bring into being a state
10
+ * that has never existed. They produce different structures — one oscillates
11
+ * back to a baseline, one advances toward an outcome — and using the wrong
12
+ * one is how rigorous work goes in circles.
13
+ *
14
+ * This module answers the routing question and nothing else. It does not
15
+ * decide, it does not block. A caller that disagrees proceeds, because
16
+ * sometimes the caller knows something the check does not.
17
+ *
18
+ * @packageDocumentation
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.ADVANCING_MARKERS = exports.ELIMINATION_MARKERS = void 0;
22
+ exports.readOrientation = readOrientation;
23
+ exports.reorient = reorient;
24
+ exports.routeFor = routeFor;
25
+ exports.worthSaying = worthSaying;
26
+ // ─── Vocabulary ───────────────────────────────────────────────────
27
+ /**
28
+ * Words that describe the removal of something unwanted rather than the
29
+ * presence of something wanted.
30
+ *
31
+ * These are **evidence, not verdicts**. "Reduce latency" is a correct outcome
32
+ * when the forest is on fire. The same phrase as a product vision is a symptom
33
+ * worth surfacing. A blocklist would be wrong in exactly the situation where
34
+ * this vocabulary is right.
35
+ */
36
+ exports.ELIMINATION_MARKERS = [
37
+ 'avoid', 'prevent', 'reduce', 'eliminate', 'stop', 'fix', 'catch',
38
+ 'remove', 'minimize', 'minimise', 'mitigate', 'resolve the problem',
39
+ 'get rid of', 'bridge the gap', 'close the gap', 'gap between',
40
+ ];
41
+ /** Words that describe a state coming into being. */
42
+ exports.ADVANCING_MARKERS = [
43
+ 'bring into being', 'establish', 'create', 'arrives', 'exists',
44
+ 'becomes', 'holds', 'carries', 'is able to', 'can now',
45
+ ];
46
+ const WORD_BOUNDARY = /[^a-z]+/;
47
+ function mentions(haystack, needle) {
48
+ const text = haystack.toLowerCase();
49
+ if (needle.includes(' '))
50
+ return text.includes(needle);
51
+ return text.split(WORD_BOUNDARY).includes(needle);
52
+ }
53
+ // ─── Reading a situation ──────────────────────────────────────────
54
+ /**
55
+ * Read a situation and say which orientation it calls for.
56
+ *
57
+ * The baseline claim decides the route; vocabulary only ever contributes
58
+ * signals. A caller who names a real prior state gets routed to gap analysis
59
+ * even if they phrased the outcome beautifully — and a caller who names none
60
+ * gets routed to structural tension even if every word they used was
61
+ * elimination-shaped.
62
+ */
63
+ function readOrientation(claim) {
64
+ const signals = [];
65
+ const eliminationHits = exports.ELIMINATION_MARKERS.filter(m => mentions(claim.outcome, m));
66
+ for (const hit of eliminationHits) {
67
+ signals.push({
68
+ kind: 'vocabulary',
69
+ detail: `"${hit}" in outcome position describes removing something, not a state that exists`,
70
+ suggests: 'oscillating',
71
+ });
72
+ }
73
+ const advancingHits = exports.ADVANCING_MARKERS.filter(m => mentions(claim.outcome, m));
74
+ for (const hit of advancingHits) {
75
+ signals.push({
76
+ kind: 'vocabulary',
77
+ detail: `"${hit}" names a state coming into being`,
78
+ suggests: 'advancing',
79
+ });
80
+ }
81
+ const hasBaseline = typeof claim.restores === 'string' && claim.restores.trim().length > 0;
82
+ signals.push(hasBaseline
83
+ ? {
84
+ kind: 'baseline',
85
+ detail: `a prior state is claimed: ${claim.restores}${claim.evidence ? ` (evidence: ${claim.evidence})` : ' — no evidence given'}`,
86
+ suggests: 'oscillating',
87
+ }
88
+ : {
89
+ kind: 'baseline',
90
+ detail: 'no prior state is being restored — there is no baseline to close toward',
91
+ suggests: 'advancing',
92
+ });
93
+ const orientation = hasBaseline ? 'oscillating' : 'advancing';
94
+ const route = hasBaseline ? 'gap-analysis' : 'structural-tension';
95
+ const reading = { orientation, route, signals };
96
+ // The two disagreements worth surfacing.
97
+ if (!hasBaseline && eliminationHits.length > 0) {
98
+ reading.advice =
99
+ 'This outcome is phrased as removing something, but nothing is being restored. ' +
100
+ 'Elimination framing here optimises against a list of known failures rather than ' +
101
+ 'toward the state you actually want. Restate it as the state that will exist.';
102
+ reading.suggestedOutcome = reorient(claim.outcome);
103
+ }
104
+ else if (hasBaseline && !claim.evidence) {
105
+ reading.advice =
106
+ 'A prior state is claimed but not evidenced. Under pressure every situation feels ' +
107
+ 'like a fire. Name when this state existed, or the routing rests on a feeling.';
108
+ }
109
+ return reading;
110
+ }
111
+ /**
112
+ * Restate an elimination-shaped outcome as a desired state.
113
+ *
114
+ * Deliberately mechanical and deliberately incomplete: it produces a prompt for
115
+ * a human or agent to finish, not a finished sentence. A confident rewrite here
116
+ * would be a machine deciding what someone wants.
117
+ */
118
+ function reorient(outcome) {
119
+ const hit = exports.ELIMINATION_MARKERS.find(m => mentions(outcome, m));
120
+ if (!hit)
121
+ return outcome;
122
+ return `[restate without "${hit}"] What state exists once this is true? — ${outcome}`;
123
+ }
124
+ /** Convenience: the route alone, for callers that only need to dispatch. */
125
+ function routeFor(claim) {
126
+ return readOrientation(claim).route;
127
+ }
128
+ /**
129
+ * Does this reading warrant interrupting the caller?
130
+ *
131
+ * True only when the orientation and the phrasing disagree. Advice on a
132
+ * situation the caller already framed correctly is noise, and noise is how
133
+ * checks get switched off.
134
+ */
135
+ function worthSaying(reading) {
136
+ return typeof reading.advice === 'string';
137
+ }
138
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@medicine-wheel/creative-orientation",
3
+ "version": "0.5.3",
4
+ "description": "Which orientation a situation calls for — advancing toward a state that has never existed, or restoring one that did. Routes to structural tension or to gap analysis.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "sideEffects": false,
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "clean": "rm -rf dist",
23
+ "prepublishOnly": "npm run clean && npm run build"
24
+ },
25
+ "keywords": [
26
+ "medicine-wheel",
27
+ "creative-orientation",
28
+ "structural-tension",
29
+ "robert-fritz",
30
+ "advancing",
31
+ "oscillating"
32
+ ],
33
+ "author": "jgwill",
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/jgwill/medicine-wheel.git",
38
+ "directory": "src/creative-orientation"
39
+ },
40
+ "devDependencies": {
41
+ "typescript": "^5.7.0"
42
+ }
43
+ }