@pathmode/mcp-server 1.26.3 → 1.27.0

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/dist/index.js CHANGED
@@ -39218,10 +39218,13 @@ module.exports = function(str) {
39218
39218
  * the results in as plain data.
39219
39219
  */
39220
39220
  Object.defineProperty(exports, "__esModule", ({ value: true }));
39221
+ exports.GENERATED_CAPTIONS = exports.VERIFICATION_NOT_DEFINED_CAPTION = exports.VERIFICATION_FEEDBACK_CAPTION = void 0;
39221
39222
  exports.renderOutcomeMeasurementDefinition = renderOutcomeMeasurementDefinition;
39222
39223
  exports.toSerializableChecks = toSerializableChecks;
39223
39224
  exports.renderAuthorizationGateText = renderAuthorizationGateText;
39224
39225
  exports.renderConfirmationsBody = renderConfirmationsBody;
39226
+ exports.normalizeCaption = normalizeCaption;
39227
+ exports.isGeneratedCaption = isGeneratedCaption;
39225
39228
  exports.serializeIntentMd = serializeIntentMd;
39226
39229
  // ── Small helpers ───────────────────────────────────────────────────────────
39227
39230
  const VERIFICATION_KIND_LABELS = {
@@ -39378,6 +39381,38 @@ const FRONTMATTER_ORDER = [
39378
39381
  'origin', 'authorization', 'authorizationNote', 'outcomeMeasurements',
39379
39382
  'evidence', 'space', 'severity', 'created', 'updated',
39380
39383
  ];
39384
+ /**
39385
+ * Captions this codebase writes into an intent.md, as opposed to anything an author wrote.
39386
+ *
39387
+ * A caption is prose under a heading that is NOT content: it explains the section rather than
39388
+ * recording a decision. The readers exclude exactly these strings, which is why they live here,
39389
+ * next to the code that emits them, and are imported rather than retyped. Excluding "all italic
39390
+ * prose" instead was wrong: an author writing `*Must not slow down page load.*` under
39391
+ * Constraints means it, and reporting that section as absent is the accusation the four-state
39392
+ * gate exists to stop making.
39393
+ *
39394
+ * Adding a caption anywhere means adding it here, or the reader will grade it as content.
39395
+ */
39396
+ exports.VERIFICATION_FEEDBACK_CAPTION = '_A feedback loop, not just a test list._';
39397
+ /** Written by lib/scan/draftIntentMd.ts when a pre-account draft has no verification yet. */
39398
+ exports.VERIFICATION_NOT_DEFINED_CAPTION = '_Not defined yet. Nothing in this spec has been checked against a running system._';
39399
+ exports.GENERATED_CAPTIONS = [
39400
+ exports.VERIFICATION_FEEDBACK_CAPTION,
39401
+ exports.VERIFICATION_NOT_DEFINED_CAPTION,
39402
+ ];
39403
+ /** Trim, drop one layer of surrounding `_` or `*`, casefold. Both emphasis spellings match. */
39404
+ function normalizeCaption(line) {
39405
+ return line
39406
+ .trim()
39407
+ .replace(/^([_*])(.*)\1$/s, '$2')
39408
+ .trim()
39409
+ .toLowerCase();
39410
+ }
39411
+ const NORMALIZED_CAPTIONS = new Set(exports.GENERATED_CAPTIONS.map(normalizeCaption));
39412
+ /** True only for a caption this codebase generated. Author prose, italic or not, is content. */
39413
+ function isGeneratedCaption(line) {
39414
+ return NORMALIZED_CAPTIONS.has(normalizeCaption(line));
39415
+ }
39381
39416
  function serializeIntentMd(spec, opts = {}) {
39382
39417
  const outcomeMeasurements = (spec.outcomes || [])
39383
39418
  .map(outcomeOf)
@@ -39531,7 +39566,7 @@ function serializeIntentMd(spec, opts = {}) {
39531
39566
  if (checkGroups.length) {
39532
39567
  sections.push('');
39533
39568
  sections.push('## Verification');
39534
- sections.push('_A feedback loop, not just a test list._');
39569
+ sections.push(exports.VERIFICATION_FEEDBACK_CAPTION);
39535
39570
  for (const g of checkGroups) {
39536
39571
  sections.push(`**${g.label}**:`);
39537
39572
  for (const c of g.checks)
@@ -41189,6 +41224,7 @@ const fs_1 = __importDefault(__nccwpck_require__(9896));
41189
41224
  const path_1 = __importDefault(__nccwpck_require__(6928));
41190
41225
  const gray_matter_1 = __importDefault(__nccwpck_require__(9599));
41191
41226
  const measurement_schema_1 = __nccwpck_require__(1635);
41227
+ const serializeIntentMd_1 = __nccwpck_require__(229);
41192
41228
  const CONFIRMATION_HEADER_RE = /^\*\*(objective|outcomes)\*\*\s*[—–-]\s*(confirmed|waived)\s+by\s+(agent|human)\s*$/i;
41193
41229
  const CONFIRMATION_FIELD_RE = /^\s*[-*]\s+(actor|problem|outcome|observable|reason|anchor|at)\s*:\s*(.+)$/i;
41194
41230
  /**
@@ -41362,7 +41398,6 @@ function parseIntentMarkdown(content, fallbackId = 'intent') {
41362
41398
  const { data, content: rawBody } = (0, gray_matter_1.default)(content);
41363
41399
  const body = stripHtmlComments(stripFencedBlocks(rawBody));
41364
41400
  const sections = splitSections(body);
41365
- const parsedVerification = extractVerification(sections);
41366
41401
  // The public schema allows verification as a flat string array; read it as manual checks
41367
41402
  // rather than silently producing {} (the same adapter normalizeSpecForReadiness applies).
41368
41403
  const frontmatterVerification = Array.isArray(data.verification)
@@ -41370,9 +41405,16 @@ function parseIntentMarkdown(content, fallbackId = 'intent') {
41370
41405
  : data.verification && typeof data.verification === 'object'
41371
41406
  ? data.verification
41372
41407
  : null;
41373
- const verification = hasVerificationContent(parsedVerification)
41374
- ? parsedVerification
41375
- : (frontmatterVerification || {});
41408
+ // Same precedence as every other section: body list, then frontmatter, then body prose.
41409
+ const verificationAll = extractVerification(sections);
41410
+ const verificationHasList = hasVerificationContent(extractVerification(sections, { includeProse: false }));
41411
+ const verification = verificationHasList
41412
+ ? verificationAll
41413
+ : frontmatterVerification && hasVerificationContent(frontmatterVerification)
41414
+ ? frontmatterVerification
41415
+ : hasVerificationContent(verificationAll)
41416
+ ? verificationAll
41417
+ : (frontmatterVerification || {});
41376
41418
  const version = Number(data.version);
41377
41419
  return {
41378
41420
  id: data.id || fallbackId,
@@ -41384,11 +41426,19 @@ function parseIntentMarkdown(content, fallbackId = 'intent') {
41384
41426
  title: data.title || data.userGoal || extractTitle(body) || 'Untitled Intent',
41385
41427
  stageName: data.stage || undefined,
41386
41428
  severity: data.severity || undefined,
41387
- outcomes: attachOutcomeMeasurements(preferSection(extractListSection(sections, 'Outcomes'), data.outcomes), data.outcomeMeasurements),
41429
+ outcomes: attachOutcomeMeasurements(preferListThenFrontmatter(sections, 'Outcomes', data.outcomes), data.outcomeMeasurements),
41388
41430
  decisions: extractDecisions(sections),
41389
- constraints: preferSection(extractListSection(sections, 'Constraints'), data.constraints),
41390
- edgeCases: (() => { const fromBody = extractEdgeCases(sections); return fromBody.length ? fromBody : frontmatterEdgeCases(data.edgeCases); })(),
41391
- healthMetrics: preferSection(extractListSection(sections, 'Health Metrics'), data.healthMetrics),
41431
+ constraints: preferListThenFrontmatter(sections, 'Constraints', data.constraints),
41432
+ edgeCases: (() => {
41433
+ const all = extractEdgeCases(sections);
41434
+ if (extractEdgeCases(sections, { includeProse: false }).length)
41435
+ return all;
41436
+ const fromFrontmatter = frontmatterEdgeCases(data.edgeCases);
41437
+ if (fromFrontmatter.length)
41438
+ return fromFrontmatter;
41439
+ return all;
41440
+ })(),
41441
+ healthMetrics: preferListThenFrontmatter(sections, 'Health Metrics', data.healthMetrics),
41392
41442
  scope: extractScope(sections) || undefined,
41393
41443
  verification,
41394
41444
  confirmations: extractConfirmations(sections),
@@ -41502,17 +41552,115 @@ function stripListMarker(line) {
41502
41552
  function isListItem(line) {
41503
41553
  return /^\s*[-*]\s/.test(line);
41504
41554
  }
41505
- function extractListSection(sections, heading) {
41506
- return sectionLines(sections, heading)
41507
- .filter(isListItem)
41508
- .map(stripListMarker)
41509
- .filter(Boolean);
41555
+ /**
41556
+ * Structure and generated captions are not content; everything else under a heading is.
41557
+ *
41558
+ * Two distinct exclusions, and they are not the same rule:
41559
+ *
41560
+ * A heading line is structure. `splitSections` only opens a section on `^## `, so a `### Regression
41561
+ * checks` subheading falls through as a body line, and treating it as prose made the HEADING an
41562
+ * executable check: a `## Verification` containing nothing but subheadings passed the gate.
41563
+ *
41564
+ * A generated caption is ours, not the author's, and the registry in serializeIntentMd.ts names
41565
+ * exactly which strings those are. This deliberately does NOT exclude all italic prose: an author
41566
+ * writing `*Must not slow down page load.*` under Constraints means it, and reporting that section
41567
+ * as absent is the accusation the four-state gate exists to stop making.
41568
+ */
41569
+ function isNotContent(line) {
41570
+ return /^#{1,6}\s/.test(line.trim()) || (0, serializeIntentMd_1.isGeneratedCaption)(line);
41571
+ }
41572
+ /**
41573
+ * Items in a section, preserving what the author actually wrote.
41574
+ *
41575
+ * List items keep their existing boundaries: one item per marker, with an indented
41576
+ * continuation line folded into the item it wraps. A run of unindented non-list lines is one
41577
+ * paragraph, and one paragraph is one item; blank lines separate paragraphs. Prose is never
41578
+ * split into sentences, so an author who writes two independently checkable outcomes as two
41579
+ * paragraphs gets two items and one who writes them as a single block gets one.
41580
+ *
41581
+ * Before this, a `.filter(isListItem)` dropped every prose line here and the gates then
41582
+ * reported the section as `absent`, which told an author who had written a constraint in prose
41583
+ * that they had written nothing. Preserving the text is what lets readiness say `unconfirmed`
41584
+ * and quote it back instead. The gates themselves are unchanged: nothing about the parse
41585
+ * relaxes a threshold, and a formatting choice never earns a pass it would not otherwise get.
41586
+ */
41587
+ function extractItemsSection(sections, heading, { includeProse = true } = {}) {
41588
+ const items = [];
41589
+ let paragraph = [];
41590
+ let lastWasListItem = false;
41591
+ const flushParagraph = () => {
41592
+ const text = paragraph.join(' ').replace(/\s+/g, ' ').trim();
41593
+ if (text)
41594
+ items.push(text);
41595
+ paragraph = [];
41596
+ };
41597
+ for (const line of sectionLines(sections, heading)) {
41598
+ if (!line.trim()) {
41599
+ flushParagraph();
41600
+ lastWasListItem = false;
41601
+ continue;
41602
+ }
41603
+ // Structure and generated captions are checked FIRST, so neither can be folded into the
41604
+ // item above it or accumulated into a paragraph. A subheading is not a wrapped bullet.
41605
+ if (isNotContent(line)) {
41606
+ flushParagraph();
41607
+ lastWasListItem = false;
41608
+ continue;
41609
+ }
41610
+ if (isListItem(line)) {
41611
+ flushParagraph();
41612
+ const text = stripListMarker(line);
41613
+ lastWasListItem = Boolean(text);
41614
+ if (text)
41615
+ items.push(text);
41616
+ continue;
41617
+ }
41618
+ // A non-blank line straight after a list item is that item's wrapped text, not a new
41619
+ // item. Markdown lazy continuation does not require indentation, and requiring it let a
41620
+ // hard-wrapped bullet split into two items: wrapping must never manufacture an outcome
41621
+ // that clears the two-outcome gate. A blank line is what ends an item. This runs
41622
+ // whatever `includeProse` says, because wrapped text belongs to the list item, not to
41623
+ // the prose the flag governs.
41624
+ if (lastWasListItem && items.length) {
41625
+ items[items.length - 1] = `${items[items.length - 1]} ${line.trim()}`.replace(/\s+/g, ' ');
41626
+ continue;
41627
+ }
41628
+ if (!includeProse) {
41629
+ flushParagraph();
41630
+ lastWasListItem = false;
41631
+ continue;
41632
+ }
41633
+ lastWasListItem = false;
41634
+ paragraph.push(line.trim());
41635
+ }
41636
+ flushParagraph();
41637
+ return items;
41510
41638
  }
41511
41639
  /**
41512
41640
  * Parse `## Decisions & Ruled-Out Alternatives` entries written by `decisionLines()`:
41513
41641
  * - **choice** (instead of: ruledOut) — reason
41514
41642
  * The separator is an em dash when written by us; a plain hyphen is accepted for hand-edited files.
41515
41643
  */
41644
+ /**
41645
+ * A section that has list items owns the field, prose included. A section that is prose only
41646
+ * yields to frontmatter, and is read only when there is no frontmatter to yield to.
41647
+ *
41648
+ * The middle step is the published normalization rule, conformance case "list fallback: a
41649
+ * section with no list items does not override frontmatter": prose under a heading must not
41650
+ * erase a structured frontmatter value. It is a rule about OVERRIDE, not about ignoring prose,
41651
+ * so a section mixing a bullet and a paragraph keeps both. The last step is the defect this
41652
+ * change exists for: with nothing in frontmatter either, prose used to vanish and the gate
41653
+ * reported the section as `absent`, telling the author they had written nothing.
41654
+ */
41655
+ function preferListThenFrontmatter(sections, heading, fromFrontmatter) {
41656
+ const all = extractItemsSection(sections, heading);
41657
+ if (extractItemsSection(sections, heading, { includeProse: false }).length)
41658
+ return all;
41659
+ const frontmatter = preferSection([], fromFrontmatter);
41660
+ if (frontmatter.length)
41661
+ return frontmatter;
41662
+ return all;
41663
+ }
41516
41664
  function extractDecisions(sections) {
41517
41665
  const out = [];
41518
41666
  for (const line of sectionLines(sections, DECISIONS_HEADING)) {
@@ -41531,12 +41679,11 @@ function extractDecisions(sections) {
41531
41679
  }
41532
41680
  return out;
41533
41681
  }
41534
- function extractEdgeCases(sections) {
41682
+ function extractEdgeCases(sections, opts = {}) {
41535
41683
  const cases = [];
41536
- for (const line of sectionLines(sections, 'Edge Cases')) {
41537
- if (!isListItem(line))
41538
- continue;
41539
- const clean = stripListMarker(line);
41684
+ // Items come from the shared reader, so a prose paragraph is an item exactly as a bullet is
41685
+ // and the pair patterns below are applied to both. Nothing here depends on the formatting.
41686
+ for (const clean of extractItemsSection(sections, 'Edge Cases', opts)) {
41540
41687
  // Pattern: **scenario**: expected behavior
41541
41688
  const match = clean.match(/^\*\*(.+?)\*\*:\s*(.+)$/);
41542
41689
  if (match) {
@@ -41550,7 +41697,13 @@ function extractEdgeCases(sections) {
41550
41697
  const arrowMatch = clean.match(/^(.+?)\s*(?:->|→|:)\s*(.+)$/);
41551
41698
  if (arrowMatch) {
41552
41699
  cases.push({ scenario: arrowMatch[1].trim(), expectedBehavior: arrowMatch[2].trim() });
41700
+ continue;
41553
41701
  }
41702
+ // No pair in it. Keep the scenario so readiness can quote it back and ask for the
41703
+ // expected behavior, and leave `expectedBehavior` empty: the gate requires both, so an
41704
+ // unpaired item cannot pass, and no behavior is invented for the author. Dropping it,
41705
+ // which is what happened before, reported the section as absent instead.
41706
+ cases.push({ scenario: clean, expectedBehavior: '' });
41554
41707
  }
41555
41708
  return cases;
41556
41709
  }
@@ -41634,7 +41787,7 @@ function parseVerificationLabel(line) {
41634
41787
  * ("E2E Tests", "Unit Tests", "Manual Checks") keep their string-array buckets, which
41635
41788
  * `toVerificationChecks()` in intent-compiler.ts adapts on read.
41636
41789
  */
41637
- function extractVerification(sections) {
41790
+ function extractVerification(sections, { includeProse = true } = {}) {
41638
41791
  const lines = sectionLines(sections, 'Verification');
41639
41792
  if (lines.length === 0)
41640
41793
  return {};
@@ -41642,9 +41795,55 @@ function extractVerification(sections) {
41642
41795
  let currentKind = null;
41643
41796
  let currentLegacy = null;
41644
41797
  let sawLabel = false;
41798
+ // Prose is preserved here on the same terms as everywhere else: a run of unindented
41799
+ // non-list lines is one paragraph and one check, attributed to the bucket it was written
41800
+ // under, and an indented wrap folds into the check above it rather than becoming a check of
41801
+ // its own. A bullet parses exactly as it did before.
41802
+ const paragraph = [];
41803
+ // A holder, not a bare `let`: TypeScript narrows a variable assigned only inside
41804
+ // closures down to its initializer, and the call below then reads as `never`.
41805
+ const last = { append: null };
41806
+ const pushText = (text) => {
41807
+ if (currentKind) {
41808
+ const { description, status, verifies } = parseCheckLine(text);
41809
+ if (!description) {
41810
+ last.append = null;
41811
+ return;
41812
+ }
41813
+ const check = { kind: currentKind, description };
41814
+ if (status)
41815
+ check.status = status;
41816
+ if (verifies)
41817
+ check.verifies = verifies;
41818
+ (result.checks ||= []).push(check);
41819
+ last.append = (extra) => { check.description = `${check.description} ${extra}`.replace(/\s+/g, ' '); };
41820
+ return;
41821
+ }
41822
+ const bucket = currentLegacy
41823
+ ? (result[currentLegacy] ||= [])
41824
+ // IntentSpec labels are optional. Treat an ungrouped item as a manual check so a
41825
+ // valid flat `## Verification` section survives adoption instead of disappearing.
41826
+ : sawLabel ? null : (result.manualChecks ||= []);
41827
+ if (!bucket) {
41828
+ last.append = null;
41829
+ return;
41830
+ }
41831
+ bucket.push(text);
41832
+ last.append = (extra) => { bucket[bucket.length - 1] = `${bucket[bucket.length - 1]} ${extra}`.replace(/\s+/g, ' '); };
41833
+ };
41834
+ const flushParagraph = () => {
41835
+ const text = paragraph.join(' ').replace(/\s+/g, ' ').trim();
41836
+ paragraph.length = 0;
41837
+ if (text)
41838
+ pushText(text);
41839
+ };
41645
41840
  for (const line of lines) {
41646
41841
  const label = parseVerificationLabel(line);
41647
41842
  if (label) {
41843
+ // Flush before switching buckets so the paragraph lands under the label it was
41844
+ // written beneath, not the next one.
41845
+ flushParagraph();
41846
+ last.append = null;
41648
41847
  sawLabel = true;
41649
41848
  const kind = VERIFICATION_LABEL_TO_KIND[label.toLowerCase()];
41650
41849
  if (kind) {
@@ -41665,31 +41864,41 @@ function extractVerification(sections) {
41665
41864
  currentLegacy = null;
41666
41865
  continue;
41667
41866
  }
41668
- if (!isListItem(line))
41867
+ if (!line.trim()) {
41868
+ flushParagraph();
41869
+ last.append = null;
41669
41870
  continue;
41670
- const text = stripListMarker(line);
41671
- if (!text)
41871
+ }
41872
+ // Structure first, so a `### Regression checks` subheading under `## Verification` can
41873
+ // neither become a check of its own nor be folded into the check above it. It used to
41874
+ // become one, and a Verification section holding nothing but subheadings passed.
41875
+ if (isNotContent(line)) {
41876
+ flushParagraph();
41877
+ last.append = null;
41672
41878
  continue;
41673
- if (currentKind) {
41674
- const { description, status, verifies } = parseCheckLine(text);
41675
- if (!description)
41879
+ }
41880
+ if (isListItem(line)) {
41881
+ flushParagraph();
41882
+ const text = stripListMarker(line);
41883
+ if (!text) {
41884
+ last.append = null;
41676
41885
  continue;
41677
- const check = { kind: currentKind, description };
41678
- if (status)
41679
- check.status = status;
41680
- if (verifies)
41681
- check.verifies = verifies;
41682
- (result.checks ||= []).push(check);
41886
+ }
41887
+ pushText(text);
41888
+ continue;
41683
41889
  }
41684
- else if (currentLegacy) {
41685
- result[currentLegacy].push(text);
41890
+ // Lazy continuation, as above: a wrapped check is one check.
41891
+ if (last.append) {
41892
+ last.append(line.trim());
41893
+ continue;
41686
41894
  }
41687
- else if (!sawLabel) {
41688
- // IntentSpec labels are optional. Treat an ungrouped list as manual checks so a valid
41689
- // flat `## Verification` section survives adoption instead of silently disappearing.
41690
- (result.manualChecks ||= []).push(text);
41895
+ if (!includeProse) {
41896
+ flushParagraph();
41897
+ continue;
41691
41898
  }
41899
+ paragraph.push(line.trim());
41692
41900
  }
41901
+ flushParagraph();
41693
41902
  return result;
41694
41903
  }
41695
41904
  function hasVerificationContent(v) {
@@ -42684,7 +42893,7 @@ async function pushSpec(input) {
42684
42893
  * https://preflight.pathmode.io, so keep it true.
42685
42894
  */
42686
42895
  Object.defineProperty(exports, "__esModule", ({ value: true }));
42687
- exports.READINESS_GATE_ORDER = exports.READINESS_BLOCKER_DESCRIPTIONS = void 0;
42896
+ exports.READINESS_GATE_ORDER = exports.READINESS_OUTCOMES_TOO_FEW_BLOCKER = exports.READINESS_BLOCKER_DESCRIPTIONS = void 0;
42688
42897
  exports.coerceText = coerceText;
42689
42898
  exports.asArray = asArray;
42690
42899
  exports.isTitleMeaningful = isTitleMeaningful;
@@ -42692,6 +42901,7 @@ exports.isConstraintConcrete = isConstraintConcrete;
42692
42901
  exports.isVerificationCheckSubstantive = isVerificationCheckSubstantive;
42693
42902
  exports.isObjectiveSpecific = isObjectiveSpecific;
42694
42903
  exports.isOutcomeMeasurable = isOutcomeMeasurable;
42904
+ exports.readinessBlockerFor = readinessBlockerFor;
42695
42905
  exports.normalizeAnchor = normalizeAnchor;
42696
42906
  exports.fieldDigest = fieldDigest;
42697
42907
  exports.computeReadinessVerdict = computeReadinessVerdict;
@@ -42811,6 +43021,18 @@ exports.READINESS_BLOCKER_DESCRIPTIONS = {
42811
43021
  edgeCases: 'No edge case with a defined expected behavior.',
42812
43022
  verification: 'No concrete verification — describe at least one check specific enough to run.',
42813
43023
  };
43024
+ /**
43025
+ * MIRROR of `OUTCOMES_TOO_FEW_BLOCKER` in lib/intentReadiness.ts; see its comment for why the
43026
+ * outcomes gate needs two messages. The threshold is unchanged.
43027
+ */
43028
+ exports.READINESS_OUTCOMES_TOO_FEW_BLOCKER = 'Fewer than two outcomes. Name at least two, one per line or paragraph, so each can be checked on its own.';
43029
+ function readinessBlockerFor(key, spec) {
43030
+ if (key !== 'outcomes')
43031
+ return exports.READINESS_BLOCKER_DESCRIPTIONS[key];
43032
+ return asArray(spec.outcomes).map(o => outcomeText(o).trim()).filter(Boolean).length < 2
43033
+ ? exports.READINESS_OUTCOMES_TOO_FEW_BLOCKER
43034
+ : exports.READINESS_BLOCKER_DESCRIPTIONS.outcomes;
43035
+ }
42814
43036
  /** Display order for the gate strip (title first, matching the Preflight page). */
42815
43037
  // ── Confirmation anchoring ──────────────────────────────────────────────────
42816
43038
  /**
@@ -42990,7 +43212,7 @@ function computeReadinessVerdict(spec) {
42990
43212
  };
42991
43213
  const failingBlockers = BLOCKER_ORDER
42992
43214
  .filter(k => !signals[k])
42993
- .map(k => exports.READINESS_BLOCKER_DESCRIPTIONS[k]);
43215
+ .map(k => readinessBlockerFor(k, spec));
42994
43216
  // What the reader read, per dimension, independent of whether the heuristic accepted it.
42995
43217
  // Placeholder text is deliberately not extracted: no path from a blank spec to confirmable.
42996
43218
  const objectiveText = coerceText(spec.objective).trim();
@@ -43008,11 +43230,14 @@ function computeReadinessVerdict(spec) {
43008
43230
  const detail = {};
43009
43231
  for (const key of exports.READINESS_GATE_ORDER) {
43010
43232
  const text = extractedBy[key] ?? '';
43233
+ // Only when it OVERRIDES the static message, so the common shape is untouched.
43234
+ const resolved = readinessBlockerFor(key, spec);
43235
+ const override = resolved && resolved !== exports.READINESS_BLOCKER_DESCRIPTIONS[key] ? { blocker: resolved } : {};
43011
43236
  detail[key] = signals[key]
43012
43237
  ? { state: 'pass', ...(text ? { extracted: text } : {}) }
43013
43238
  : text
43014
- ? { state: 'unconfirmed', extracted: text }
43015
- : { state: 'absent' };
43239
+ ? { state: 'unconfirmed', extracted: text, ...override }
43240
+ : { state: 'absent', ...override };
43016
43241
  }
43017
43242
  // Confirmations only ever move a dimension the heuristics already failed; `signals` is never
43018
43243
  // mutated, so the lexical verdict stays visible underneath.
@@ -43070,15 +43295,36 @@ function formatReadinessFrontmatter(verdict) {
43070
43295
  * The extra line an `unconfirmed` dimension earns: what was read, and an honest statement of
43071
43296
  * what the check could not find in it.
43072
43297
  *
43073
- * Only objective and outcomes appear here, and that scoping is the finding, not caution. The
43074
- * audit measured that most failures on those two are false negatives from a fixed English
43075
- * vocabulary. Verification's measured misses were all extraction failures, so quoting text
43076
- * back there would imply a confidence the evidence does not support.
43298
+ * Objective and outcomes get the SOFTENED copy, and that scoping is the finding, not caution:
43299
+ * the audit measured that most failures on those two are false negatives from a fixed English
43300
+ * vocabulary, so telling those authors the text may be fine is honest.
43301
+ *
43302
+ * Constraints, edge cases and verification get a hint too, but a plainer one. Their measured
43303
+ * misses were extraction failures, and the audit never measured their lexical recall, so the
43304
+ * copy states what was read and what is missing from it and stops there. It does not say the
43305
+ * check is probably wrong, because for these three there is no evidence that it is. They earn
43306
+ * a hint at all only because the parser now preserves prose: before that, an unread section
43307
+ * reached this code as `absent`, there was nothing extracted to quote, and the reader was told
43308
+ * it had written nothing.
43077
43309
  */
43078
43310
  const UNCONFIRMED_HINT = {
43079
43311
  objective: 'Read this, but could not confirm an affected actor and a concrete problem in it. If it already names them, this check reads a fixed vocabulary and may be missing valid phrasing:',
43080
43312
  outcomes: 'Read these, but could not confirm an observable threshold in enough of them. If they are already observable, this check reads a fixed vocabulary and may be missing valid phrasing:',
43313
+ constraints: 'Read this, but could not confirm a hard limit in it. A constraint names something that must never happen:',
43314
+ edgeCases: 'Read this, but no expected behavior was paired with it. Write the case as "situation: what should happen", one per line or paragraph:',
43315
+ verification: 'Read this, but could not confirm a check specific enough to run. A check names a command or a stated expected result:',
43081
43316
  };
43317
+ /**
43318
+ * The hint has to follow the blocker that was actually chosen. When outcomes failed on COUNT,
43319
+ * the measurability hint contradicted the line directly above it and accused wording the
43320
+ * detector had accepted.
43321
+ */
43322
+ function unconfirmedHintFor(key, d) {
43323
+ if (key === 'outcomes' && d?.blocker === exports.READINESS_OUTCOMES_TOO_FEW_BLOCKER) {
43324
+ return 'Read this. If it holds more than one outcome, separate them so each can be checked on its own:';
43325
+ }
43326
+ return UNCONFIRMED_HINT[key];
43327
+ }
43082
43328
  /** Keep a quoted extraction to one readable line; the full text is in verdict.detail. */
43083
43329
  function truncateForQuote(text, max = 160) {
43084
43330
  const flat = text.replace(/\s+/g, ' ').trim();
@@ -43130,10 +43376,11 @@ repairHint) {
43130
43376
  for (const key of BLOCKER_ORDER) {
43131
43377
  if (verdict.signals[key] || resolved(key) === 'pass' || resolved(key) === 'not_applicable')
43132
43378
  continue;
43133
- lines.push(` ✗ ${exports.READINESS_BLOCKER_DESCRIPTIONS[key]}`);
43379
+ lines.push(` ✗ ${verdict.detail?.[key]?.blocker ?? exports.READINESS_BLOCKER_DESCRIPTIONS[key]}`);
43134
43380
  const d = verdict.detail?.[key];
43135
- if (d?.state === 'unconfirmed' && d.extracted && UNCONFIRMED_HINT[key]) {
43136
- lines.push(` ↳ ${UNCONFIRMED_HINT[key]}`);
43381
+ const hint = unconfirmedHintFor(key, d);
43382
+ if (d?.state === 'unconfirmed' && d.extracted && hint) {
43383
+ lines.push(` ↳ ${hint}`);
43137
43384
  lines.push(` "${truncateForQuote(d.extracted)}"`);
43138
43385
  }
43139
43386
  }
@@ -72903,7 +73150,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"$schema":"http://json-schema.org/dra
72903
73150
  /***/ ((module) => {
72904
73151
 
72905
73152
  "use strict";
72906
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@pathmode/mcp-server","version":"1.26.3","publishConfig":{"access":"public"},"mcpName":"io.github.pathmodeio/mcp-server","description":"Deterministic intent preflight before your agent builds: six calibrated gates, keyless, no model call. Draft and sharpen specs in conversation, or connect a Pathmode workspace to sync intent and evidence across a team.","main":"dist/index.js","bin":{"pathmode-mcp":"dist/index.js"},"files":["dist/","manifest.json","icon.svg","README.md","skills/"],"scripts":{"build":"rm -rf dist && ncc build src/index.ts -o dist","dev":"ts-node src/index.ts","prepublishOnly":"npm run build"},"keywords":["pathmode","mcp","model-context-protocol","claude-code","claude-code-skills","agent-skills","cursor","windsurf","intent-engineering","intent-compiler","ai-agents","product-development","dependency-graph","strategic-planning"],"author":"Pathmode","license":"MIT","type":"commonjs","engines":{"node":">=18.0.0"},"homepage":"https://pathmode.io","dependencies":{"@modelcontextprotocol/sdk":"^1.12.1","gray-matter":"^4.0.3","zod":"^3.24.0"},"overrides":{"@hono/node-server":"^1.19.17","body-parser":"^2.3.0","fast-uri":"^3.1.6","hono":"^4.13.5","ip-address":"^10.7.0","js-yaml":"^3.15.2"},"devDependencies":{"@types/node":"^25.1.0","@vercel/ncc":"^0.38.4","ts-node":"^10.9.2","typescript":"^5.9.3"}}');
73153
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@pathmode/mcp-server","version":"1.27.0","publishConfig":{"access":"public"},"mcpName":"io.github.pathmodeio/mcp-server","description":"Deterministic intent preflight before your agent builds: six calibrated gates, keyless, no model call. Draft and sharpen specs in conversation, or connect a Pathmode workspace to sync intent and evidence across a team.","main":"dist/index.js","bin":{"pathmode-mcp":"dist/index.js"},"files":["dist/","manifest.json","icon.svg","README.md","skills/"],"scripts":{"build":"rm -rf dist && ncc build src/index.ts -o dist","dev":"ts-node src/index.ts","prepublishOnly":"npm run build"},"keywords":["pathmode","mcp","model-context-protocol","claude-code","claude-code-skills","agent-skills","cursor","windsurf","intent-engineering","intent-compiler","ai-agents","product-development","dependency-graph","strategic-planning"],"author":"Pathmode","license":"MIT","type":"commonjs","engines":{"node":">=18.0.0"},"homepage":"https://pathmode.io","dependencies":{"@modelcontextprotocol/sdk":"^1.12.1","gray-matter":"^4.0.3","zod":"^3.24.0"},"overrides":{"@hono/node-server":"^1.19.17","body-parser":"^2.3.0","fast-uri":"^3.1.6","hono":"^4.13.5","ip-address":"^10.7.0","js-yaml":"^3.15.2"},"devDependencies":{"@types/node":"^25.1.0","@vercel/ncc":"^0.38.4","ts-node":"^10.9.2","typescript":"^5.9.3"}}');
72907
73154
 
72908
73155
  /***/ })
72909
73156
 
@@ -184,5 +184,25 @@ export declare function renderAuthorizationGateText(opts: {
184
184
  * so an unwaivable dimension never leaves an empty section behind.
185
185
  */
186
186
  export declare function renderConfirmationsBody(records: SerializableConfirmation[] | undefined): string;
187
+ /**
188
+ * Captions this codebase writes into an intent.md, as opposed to anything an author wrote.
189
+ *
190
+ * A caption is prose under a heading that is NOT content: it explains the section rather than
191
+ * recording a decision. The readers exclude exactly these strings, which is why they live here,
192
+ * next to the code that emits them, and are imported rather than retyped. Excluding "all italic
193
+ * prose" instead was wrong: an author writing `*Must not slow down page load.*` under
194
+ * Constraints means it, and reporting that section as absent is the accusation the four-state
195
+ * gate exists to stop making.
196
+ *
197
+ * Adding a caption anywhere means adding it here, or the reader will grade it as content.
198
+ */
199
+ export declare const VERIFICATION_FEEDBACK_CAPTION = "_A feedback loop, not just a test list._";
200
+ /** Written by lib/scan/draftIntentMd.ts when a pre-account draft has no verification yet. */
201
+ export declare const VERIFICATION_NOT_DEFINED_CAPTION = "_Not defined yet. Nothing in this spec has been checked against a running system._";
202
+ export declare const GENERATED_CAPTIONS: readonly string[];
203
+ /** Trim, drop one layer of surrounding `_` or `*`, casefold. Both emphasis spellings match. */
204
+ export declare function normalizeCaption(line: string): string;
205
+ /** True only for a caption this codebase generated. Author prose, italic or not, is content. */
206
+ export declare function isGeneratedCaption(line: string): boolean;
187
207
  export declare function serializeIntentMd(spec: SerializableIntent, opts?: SerializeIntentMdOptions): string;
188
208
  //# sourceMappingURL=serializeIntentMd.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serializeIntentMd.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/intentspec-format/serializeIntentMd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serializeIntentMd.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/intentspec-format/serializeIntentMd.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"local-reader.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/local-reader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-reader.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/local-reader.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,12 @@ export declare function isVerificationCheckSubstantive(description: string | nul
20
20
  export declare function isObjectiveSpecific(objective: string | null | undefined): boolean;
21
21
  export declare function isOutcomeMeasurable(text: string): boolean;
22
22
  export declare const READINESS_BLOCKER_DESCRIPTIONS: Record<string, string>;
23
+ /**
24
+ * MIRROR of `OUTCOMES_TOO_FEW_BLOCKER` in lib/intentReadiness.ts; see its comment for why the
25
+ * outcomes gate needs two messages. The threshold is unchanged.
26
+ */
27
+ export declare const READINESS_OUTCOMES_TOO_FEW_BLOCKER = "Fewer than two outcomes. Name at least two, one per line or paragraph, so each can be checked on its own.";
28
+ export declare function readinessBlockerFor(key: string, spec: ReadinessSpecInput): string;
23
29
  /**
24
30
  * Fold away everything that is a rewrite of the same claim, and nothing that is a change to it.
25
31
  * NFC because one glyph has two encodings; soft hyphens because editors inject them invisibly;
@@ -86,6 +92,12 @@ export interface DimensionDetail {
86
92
  state: DimensionState;
87
93
  /** What the reader actually read for this dimension, for quoting back. */
88
94
  extracted?: string;
95
+ /**
96
+ * Set ONLY when this failure's message overrides the static one. MIRROR of
97
+ * `DimensionDetail.blocker` in lib/intentReadiness.ts: outcomes fails either on count or on
98
+ * measurability, and `formatReadinessVerdict` never receives the spec.
99
+ */
100
+ blocker?: string;
89
101
  /** Set when a confirmation or waiver moved this dimension: who vouched, and how well we know it. */
90
102
  confirmedBy?: 'agent' | 'human';
91
103
  assurance?: 'authenticated' | 'local-unverified';
@@ -1 +1 @@
1
- {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/readiness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/readiness.ts"],"names":[],"mappings":"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"}
package/manifest.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "manifest_version": "0.3",
3
3
  "name": "pathmode",
4
4
  "display_name": "Pathmode",
5
- "version": "1.26.3",
5
+ "version": "1.27.0",
6
6
  "description": "Deterministic preflight for the intent you hand to a coding agent: six calibrated gates, the exact blockers named, no model call, no key needed.",
7
7
  "long_description": "Pathmode MCP Server runs a deterministic preflight before your coding agent builds: check_intent_readiness scores an intent spec against six calibrated gates (title, objective, outcomes, constraints, edge cases, verification) and names the exact blockers, with no model call and no account. Keyless local mode works out of the box; specs live in intent.md in your repo, plain markdown you own, and skills for drafting, pressure-testing, and handing off intent ride along. Connect a Pathmode workspace with an API key to sync intent and evidence across a team, analyze dependency graphs, and verify pull requests against the outcomes you agreed to.",
8
8
  "author": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pathmode/mcp-server",
3
- "version": "1.26.3",
3
+ "version": "1.27.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },