@rubytech/create-maxy-code 0.1.29 → 0.1.30

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.
Files changed (41) hide show
  1. package/dist/__tests__/init-logging.test.js +85 -0
  2. package/dist/index.js +21 -10
  3. package/dist/init-logging.js +28 -0
  4. package/package.json +1 -1
  5. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  6. package/payload/platform/plugins/admin/PLUGIN.md +1 -1
  7. package/payload/platform/plugins/admin/hooks/onboarding-skill-drift.sh +56 -54
  8. package/payload/platform/plugins/admin/references/contextual-ui.md +4 -2
  9. package/payload/platform/plugins/admin/skills/file-presentation/SKILL.md +16 -33
  10. package/payload/platform/plugins/admin/skills/plugin-management/SKILL.md +1 -1
  11. package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +1 -1
  12. package/payload/platform/plugins/brochures/PLUGIN.md +1 -1
  13. package/payload/platform/plugins/buyers/PLUGIN.md +1 -2
  14. package/payload/platform/plugins/deep-research/skills/book-mirror/SKILL.md +1 -1
  15. package/payload/platform/plugins/deep-research/skills/strategic-reading/SKILL.md +1 -1
  16. package/payload/platform/plugins/docs/references/plugins-guide.md +2 -2
  17. package/payload/platform/plugins/estate-business/PLUGIN.md +1 -2
  18. package/payload/platform/plugins/estate-coaching/PLUGIN.md +1 -2
  19. package/payload/platform/plugins/estate-onboarding/PLUGIN.md +1 -2
  20. package/payload/platform/plugins/estate-sales/PLUGIN.md +1 -2
  21. package/payload/platform/plugins/estate-teaching/PLUGIN.md +1 -2
  22. package/payload/platform/plugins/leads/PLUGIN.md +1 -2
  23. package/payload/platform/plugins/listings/PLUGIN.md +1 -2
  24. package/payload/platform/plugins/loop/PLUGIN.md +1 -1
  25. package/payload/platform/plugins/scheduling/PLUGIN.md +1 -1
  26. package/payload/platform/plugins/vendors/PLUGIN.md +1 -2
  27. package/payload/premium-plugins/real-agent/BUNDLE.md +5 -5
  28. package/payload/premium-plugins/real-agent/agents/compliance.md +1 -1
  29. package/payload/premium-plugins/real-agent/agents/negotiator.md +1 -1
  30. package/payload/premium-plugins/real-agent/agents/valuer.md +1 -1
  31. package/payload/premium-plugins/real-agent/plugins/brochures/PLUGIN.md +1 -1
  32. package/payload/premium-plugins/real-agent/plugins/buyers/PLUGIN.md +1 -2
  33. package/payload/premium-plugins/real-agent/plugins/estate-business/PLUGIN.md +1 -2
  34. package/payload/premium-plugins/real-agent/plugins/estate-coaching/PLUGIN.md +1 -2
  35. package/payload/premium-plugins/real-agent/plugins/estate-onboarding/PLUGIN.md +1 -2
  36. package/payload/premium-plugins/real-agent/plugins/estate-sales/PLUGIN.md +1 -2
  37. package/payload/premium-plugins/real-agent/plugins/estate-teaching/PLUGIN.md +1 -2
  38. package/payload/premium-plugins/real-agent/plugins/leads/PLUGIN.md +1 -2
  39. package/payload/premium-plugins/real-agent/plugins/listings/PLUGIN.md +1 -2
  40. package/payload/premium-plugins/real-agent/plugins/loop/PLUGIN.md +1 -1
  41. package/payload/premium-plugins/real-agent/plugins/vendors/PLUGIN.md +1 -2
@@ -0,0 +1,85 @@
1
+ // Coverage for runInitLogging's success and failure branches via injected
2
+ // fs / stderr / exit impls. Task 062 (maxy-code).
3
+ //
4
+ // Brief asked for vitest. Codebase convention is node:test (matches
5
+ // apt-resolve.test.ts, peer-brand-detect.test.ts, etc); the package has no
6
+ // vitest dep and the test runner stanza in package.json invokes
7
+ // `node --test 'dist/__tests__/*.test.js'`.
8
+ import test from "node:test";
9
+ import assert from "node:assert/strict";
10
+ import { runInitLogging } from "../init-logging.js";
11
+ const LOG_DIR = "/tmp/test-task-062-logs";
12
+ const LOG_FILE = "/tmp/test-task-062-logs/install-2026-01-01T00-00-00-000Z.log";
13
+ const PERSIST_DIR = "/tmp/test-task-062-persist";
14
+ test("success path: header written via injected impls, no stderr, no exit", () => {
15
+ const appendCalls = [];
16
+ let stderrOut = "";
17
+ let exitCode = null;
18
+ runInitLogging({
19
+ logDir: LOG_DIR,
20
+ logFile: LOG_FILE,
21
+ persistDir: PERSIST_DIR,
22
+ headerLines: ["", "===", " Maxy Code Install Log", "==="],
23
+ mkdirSyncImpl: () => { },
24
+ appendFileSyncImpl: (p, d) => { appendCalls.push([p, d]); },
25
+ stderrWriteImpl: (c) => { stderrOut += c; },
26
+ exitImpl: (c) => { exitCode = c; },
27
+ });
28
+ assert.equal(appendCalls.length, 1);
29
+ assert.equal(appendCalls[0][0], LOG_FILE);
30
+ assert.equal(appendCalls[0][1], "\n===\n Maxy Code Install Log\n===\n");
31
+ assert.equal(stderrOut, "");
32
+ assert.equal(exitCode, null);
33
+ });
34
+ test("failure path: appendFileSync throws → stderr emits FAILED line, exit(1) called", () => {
35
+ let stderrOut = "";
36
+ let exitCode = null;
37
+ runInitLogging({
38
+ logDir: LOG_DIR,
39
+ logFile: LOG_FILE,
40
+ persistDir: PERSIST_DIR,
41
+ headerLines: ["a"],
42
+ mkdirSyncImpl: () => { },
43
+ appendFileSyncImpl: () => { throw new Error("EACCES: permission denied"); },
44
+ stderrWriteImpl: (c) => { stderrOut += c; },
45
+ exitImpl: (c) => { exitCode = c; },
46
+ });
47
+ assert.ok(stderrOut.includes("[create-maxy] init-logging FAILED reason=EACCES"), `stderr should contain init-logging FAILED line; got: ${JSON.stringify(stderrOut)}`);
48
+ assert.ok(stderrOut.includes(`log=${LOG_FILE}`));
49
+ assert.ok(stderrOut.includes(`persist=${PERSIST_DIR}`));
50
+ assert.equal(exitCode, 1);
51
+ });
52
+ test("failure path: mkdirSync throws → stderr emits FAILED line, exit(1) called", () => {
53
+ let stderrOut = "";
54
+ let exitCode = null;
55
+ let appendCalled = false;
56
+ runInitLogging({
57
+ logDir: LOG_DIR,
58
+ logFile: LOG_FILE,
59
+ persistDir: PERSIST_DIR,
60
+ headerLines: ["a"],
61
+ mkdirSyncImpl: () => { throw new Error("EROFS: read-only file system"); },
62
+ appendFileSyncImpl: () => { appendCalled = true; },
63
+ stderrWriteImpl: (c) => { stderrOut += c; },
64
+ exitImpl: (c) => { exitCode = c; },
65
+ });
66
+ assert.equal(appendCalled, false, "appendFileSync must not be invoked when mkdirSync throws");
67
+ assert.ok(stderrOut.includes("[create-maxy] init-logging FAILED reason=EROFS"));
68
+ assert.equal(exitCode, 1);
69
+ });
70
+ test("failure path: non-Error thrown value still surfaces as reason", () => {
71
+ let stderrOut = "";
72
+ let exitCode = null;
73
+ runInitLogging({
74
+ logDir: LOG_DIR,
75
+ logFile: LOG_FILE,
76
+ persistDir: PERSIST_DIR,
77
+ headerLines: ["a"],
78
+ mkdirSyncImpl: () => { },
79
+ appendFileSyncImpl: () => { throw "raw-string"; },
80
+ stderrWriteImpl: (c) => { stderrOut += c; },
81
+ exitImpl: (c) => { exitCode = c; },
82
+ });
83
+ assert.ok(stderrOut.includes("reason=raw-string"));
84
+ assert.equal(exitCode, 1);
85
+ });
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import { resolveInstallPortFromFs, buildMaxyUnitFile, buildClaudeSessionManagerU
7
7
  import { classifyOnboardingReadBack } from "./onboarding-readback.js";
8
8
  import { parseOsRelease, isUbuntuLike as isUbuntuLikePure, parseAptCacheCandidate, decideAptResolution, } from "./apt-resolve.js";
9
9
  import { findPeerBrandOnDefaultNeo4jPort } from "./peer-brand-detect.js";
10
+ import { runInitLogging } from "./init-logging.js";
10
11
  import { requireSupportedPlatform } from "./platform-detect.js";
11
12
  import { renderPlist } from "./launchd-plist.js";
12
13
  import { installAllBrewPackages } from "./brew-install.js";
@@ -82,15 +83,19 @@ const NPM_NET_FLAGS = [
82
83
  // Logging — timestamped to console AND persistent log file
83
84
  // ---------------------------------------------------------------------------
84
85
  function initLogging() {
85
- mkdirSync(LOG_DIR, { recursive: true });
86
- appendFileSync(LOG_FILE, [
87
- "",
88
- "=".repeat(64),
89
- ` ${BRAND.productName} Install Log — ${new Date().toISOString()}`,
90
- ` Node ${process.version} | ${process.platform} ${process.arch}`,
91
- "=".repeat(64),
92
- "",
93
- ].join("\n") + "\n");
86
+ runInitLogging({
87
+ logDir: LOG_DIR,
88
+ logFile: LOG_FILE,
89
+ persistDir: PERSIST_DIR,
90
+ headerLines: [
91
+ "",
92
+ "=".repeat(64),
93
+ ` ${BRAND.productName} Install Log — ${new Date().toISOString()}`,
94
+ ` Node ${process.version} | ${process.platform} ${process.arch}`,
95
+ "=".repeat(64),
96
+ "",
97
+ ],
98
+ });
94
99
  }
95
100
  function logFile(msg) {
96
101
  try {
@@ -3596,8 +3601,14 @@ if (PLATFORM === "darwin") {
3596
3601
  const PLATFORM_HEADER = `[create-maxy] platform=${PLATFORM} arch=${process.arch}` +
3597
3602
  (MACOS_VERSION ? ` macos=${MACOS_VERSION}` : ``) +
3598
3603
  ` version=${PKG_VERSION}`;
3599
- initLogging();
3604
+ // Task 062 — emit platform header and the resolved log/persist paths to
3605
+ // stdout BEFORE the log file is opened. If initLogging's mkdir or first
3606
+ // appendFileSync throws, the operator still sees brand/version/arch and the
3607
+ // exact path the log file SHOULD live at, instead of a silent exit between
3608
+ // the LOG_DIR mkdir and the first log write.
3600
3609
  console.log(PLATFORM_HEADER);
3610
+ console.log(`[create-maxy] log=${LOG_FILE} persist=${PERSIST_DIR}`);
3611
+ initLogging();
3601
3612
  console.log("================================================================");
3602
3613
  console.log(` ${BRAND.productName} — ${BRAND.tagline}. (${BRAND.hostname} v${PKG_VERSION})`);
3603
3614
  console.log("================================================================");
@@ -0,0 +1,28 @@
1
+ // Installer log-file initialization with diagnostic stderr emission on
2
+ // failure. Extracted from index.ts so the failure path can be covered by
3
+ // node:test without bringing in the rest of the installer's import-time side
4
+ // effects.
5
+ //
6
+ // Task 062 (maxy-code) — operator-observed silent exit between
7
+ // `mkdirSync(LOG_DIR)` and the first `appendFileSync(LOG_FILE, header)`.
8
+ // Both writes are guarded inside the same try/catch; a failure emits a
9
+ // literal `[create-maxy] init-logging FAILED reason=<msg> log=<path>
10
+ // persist=<path>` line to stderr and exits 1 so the operator always has a
11
+ // forensic surface regardless of whether the log file ever opened.
12
+ import { mkdirSync as realMkdirSync, appendFileSync as realAppendFileSync, } from "node:fs";
13
+ export function runInitLogging(opts) {
14
+ const mkdir = opts.mkdirSyncImpl ?? ((p, o) => { realMkdirSync(p, o); });
15
+ const append = opts.appendFileSyncImpl ?? ((p, d) => { realAppendFileSync(p, d); });
16
+ const stderr = opts.stderrWriteImpl ?? ((c) => { process.stderr.write(c); });
17
+ const exit = opts.exitImpl ?? ((c) => { process.exit(c); });
18
+ try {
19
+ mkdir(opts.logDir, { recursive: true });
20
+ append(opts.logFile, opts.headerLines.join("\n") + "\n");
21
+ }
22
+ catch (err) {
23
+ const msg = err instanceof Error ? err.message : String(err);
24
+ stderr(`[create-maxy] init-logging FAILED reason=${msg} log=${opts.logFile} persist=${opts.persistDir}\n`);
25
+ exit(1);
26
+ return;
27
+ }
28
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.29",
3
+ "version": "0.1.30",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "admin",
3
- "description": "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), brand-settings, account-manage, account-update, admin-add, admin-remove, admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), render-component, session-reset, session-resume, file-attach, wifi, and action-approval tools (action-pending, action-approve, action-reject, action-edit) for managing the Maxy platform.",
3
+ "description": "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver, single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), brand-settings, account-manage, account-update, admin-add, admin-remove, admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name, the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), session-reset, session-resume, file-attach, wifi, and action-approval tools (action-pending, action-approve, action-reject, action-edit) for managing the Maxy platform. The `render-component` MCP tool is also registered but is exposed to the public agent surface only (Anthropic API runtime); the admin agent on native Claude Code does not call it.",
4
4
  "version": "0.1.0",
5
5
  "author": {
6
6
  "name": "Rubytech LLC"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: admin
3
- description: "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), brand-settings, account-manage, account-update, admin-add, admin-remove, admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), render-component, session-reset, session-resume, file-attach, wifi, and action-approval tools (action-pending, action-approve, action-reject, action-edit) for managing the Maxy platform."
3
+ description: "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver, single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), brand-settings, account-manage, account-update, admin-add, admin-remove, admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name, the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), session-reset, session-resume, file-attach, wifi, and action-approval tools (action-pending, action-approve, action-reject, action-edit) for managing the Maxy platform. The `render-component` MCP tool is also registered but is exposed to the public agent surface only (Anthropic API runtime); the admin agent on native Claude Code does not call it."
4
4
  tools:
5
5
  - name: system-status
6
6
  publicAllowlist: false
@@ -1,100 +1,102 @@
1
1
  #!/usr/bin/env bash
2
- # Task 038 Outcome E1 Stop-event hook that flags the admin agent's
3
- # onboarding-skill drift pattern: the prior /input carried an
4
- # `<onboarding-state>` block, but the latest assistant turn did not call
5
- # `render-component` AND did not end with a `?`-terminated sentence.
2
+ # Task 063 / Task 049. Stop-event hook that flags admin agent onboarding
3
+ # drift on the native Claude Code (PTY) surface. Post-Task-049 there is no
4
+ # `render-component` tool, so the contract is no longer "called render-component";
5
+ # it is "the assistant ends its turn on a prompt the operator can answer".
6
6
  #
7
7
  # Behaviour:
8
- # 1. Read the transcript_path from the Stop event JSON on stdin.
8
+ # 1. Read transcript_path from the Stop event JSON on stdin.
9
9
  # 2. Walk the JSONL backwards. Find the most recent user event whose
10
- # `message.content` (string or text-block array) contains the literal
11
- # `<onboarding-state ` marker — that is the injection signature.
10
+ # `message.content` contains the literal `<onboarding-state ` marker.
12
11
  # 3. If no such user event exists in this transcript, fail-open (exit 0).
13
- # 4. Otherwise, find the most recent assistant event after that injection
14
- # event. Extract its tool-use names and the trailing text characters.
15
- # 5. If the tool-use list does NOT contain `render-component` AND the
16
- # trailing prose does NOT end with `?`, the agent has drifted — log
17
- # one `[precision-check] rule=onboarding-skill-drift` line to the
18
- # admin-side log directory and exit 0.
12
+ # 4. Otherwise, find the most recent assistant event after that injection.
13
+ # Count assistant turns since the injection so the log line carries a turn number.
14
+ # 5. Evaluate the ends-with-prompt contract on the assistant text:
15
+ # - PASS when the last non-whitespace character is `?`, OR
16
+ # - PASS when the trailing block (last ~8 lines) contains a numbered
17
+ # or bulleted list item (`1. `, `2) `, `- `, `* `).
18
+ # - FAIL otherwise.
19
+ # 6. Emit `[onboarding-skill-drift] turn=<N> contract=ends-with-prompt
20
+ # result=<pass|fail> reason=<reason>` on stderr.
19
21
  #
20
- # Exit 0 always this hook is observation, not enforcement. The
21
- # precision-check ledger increments via the log line; no retry is forced.
22
- # Infrastructure failures (jq missing, transcript unreadable) also exit 0
23
- # so a hook bug never blocks the agent's response.
22
+ # Exit 0 always: this hook is observation, not enforcement. Infrastructure
23
+ # failures (jq missing, transcript unreadable) also exit 0 so a hook bug
24
+ # never blocks the agent's response.
24
25
 
25
26
  set -uo pipefail
26
- LOG_TAG="[precision-check]"
27
+ LOG_TAG="[onboarding-skill-drift]"
27
28
 
28
- # fail-open if jq is unavailable — the transcript shape demands JSON parse
29
29
  if ! command -v jq >/dev/null 2>&1; then
30
- echo "$LOG_TAG rule=onboarding-skill-drift result=skip reason=jq-missing" >&2
30
+ echo "$LOG_TAG turn=0 contract=ends-with-prompt result=skip reason=jq-missing" >&2
31
31
  exit 0
32
32
  fi
33
33
 
34
34
  INPUT=$(cat 2>/dev/null || echo '{}')
35
35
  TRANSCRIPT=$(echo "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
36
36
  if [ -z "$TRANSCRIPT" ] || [ ! -f "$TRANSCRIPT" ]; then
37
- echo "$LOG_TAG rule=onboarding-skill-drift result=skip reason=no-transcript" >&2
37
+ echo "$LOG_TAG turn=0 contract=ends-with-prompt result=skip reason=no-transcript" >&2
38
38
  exit 0
39
39
  fi
40
40
 
41
- # Locate the most recent injection signature in user events. The injection
42
- # block is prepended verbatim to the operator's input on the first /input
43
- # of an eligible session, so it appears as the leading bytes of a user
44
- # event's message text. Search backwards to find the last one in this
45
- # transcript window.
41
+ # Locate the most recent <onboarding-state ...> injection in a user event.
42
+ # The injection block is prepended verbatim to the operator's input on the
43
+ # first /input of an eligible session, so it appears as the leading bytes of
44
+ # the user event's message text. Search backwards for the last one.
46
45
  INJECTION_LINE=$(grep -n '<onboarding-state ' "$TRANSCRIPT" 2>/dev/null \
47
46
  | grep '"type":"user"' \
48
47
  | tail -n 1 \
49
48
  | cut -d: -f1)
50
49
 
51
50
  if [ -z "$INJECTION_LINE" ]; then
52
- # No injection in this transcript window nothing to enforce.
51
+ # No injection in this transcript window. Nothing to evaluate.
53
52
  exit 0
54
53
  fi
55
54
 
56
- # Slice the file from just after the injection line to the end; the
57
- # assistant's response sits in that suffix.
55
+ # Slice the file from just after the injection line.
58
56
  TAIL=$(tail -n "+$((INJECTION_LINE + 1))" "$TRANSCRIPT" 2>/dev/null)
59
57
 
60
- # Last assistant message in the suffix.
61
- ASSISTANT=$(echo "$TAIL" \
62
- | grep '"type":"assistant"' \
63
- | tail -n 1)
58
+ # Count assistant turns since the injection and pick the most recent.
59
+ ASSISTANT_TURNS=$(echo "$TAIL" | grep -c '"type":"assistant"')
60
+ ASSISTANT=$(echo "$TAIL" | grep '"type":"assistant"' | tail -n 1)
64
61
 
65
62
  if [ -z "$ASSISTANT" ]; then
66
- echo "$LOG_TAG rule=onboarding-skill-drift result=skip reason=no-assistant-turn" >&2
63
+ echo "$LOG_TAG turn=0 contract=ends-with-prompt result=skip reason=no-assistant-turn" >&2
67
64
  exit 0
68
65
  fi
69
66
 
70
- # Tool-use names from the assistant event.
71
- TOOL_USES=$(echo "$ASSISTANT" | jq -r '
72
- .message.content // []
73
- | map(select(.type == "tool_use") | .name)
74
- | join(",")
75
- ' 2>/dev/null)
76
-
77
- # Concatenated text content (final character matters for the `?` check).
67
+ # Concatenated text content (final character matters for the `?` check; final
68
+ # block matters for the enumerated-list check).
78
69
  ASSISTANT_TEXT=$(echo "$ASSISTANT" | jq -r '
79
70
  .message.content // []
80
71
  | map(select(.type == "text") | .text)
81
- | join(" ")
72
+ | join("\n")
82
73
  ' 2>/dev/null)
83
74
 
84
- HAS_RENDER_COMPONENT=0
85
- case "$TOOL_USES" in
86
- *render-component*) HAS_RENDER_COMPONENT=1 ;;
87
- esac
88
-
89
- # Trim trailing whitespace and check the last non-whitespace character.
75
+ # Trim trailing whitespace and find the last non-whitespace character.
90
76
  TRIMMED=$(echo "$ASSISTANT_TEXT" | sed -E 's/[[:space:]]+$//')
91
77
  LAST_CHAR=$(echo -n "$TRIMMED" | tail -c 1)
92
78
 
93
- if [ "$HAS_RENDER_COMPONENT" = "0" ] && [ "$LAST_CHAR" != "?" ]; then
94
- # Drift detected. Sample is the first 80 chars of the assistant text so
95
- # the log line tells the operator what shape of drift fired.
96
- SAMPLE=$(echo "$TRIMMED" | head -c 80 | tr '\n' ' ')
97
- echo "$LOG_TAG rule=onboarding-skill-drift result=block class=PRECISION sample='${SAMPLE}'" >&2
79
+ # Evaluate the ends-with-prompt contract.
80
+ ENDS_WITH_PROMPT=0
81
+ ENDS_WITH_PROMPT_REASON="neither-question-nor-list"
82
+
83
+ if [ "$LAST_CHAR" = "?" ]; then
84
+ ENDS_WITH_PROMPT=1
85
+ ENDS_WITH_PROMPT_REASON="trailing-question-mark"
86
+ else
87
+ # Take the last 8 lines and look for a numbered/bulleted list item.
88
+ TRAIL_LINES=$(echo "$TRIMMED" | tail -n 8)
89
+ if echo "$TRAIL_LINES" | grep -qE '^[[:space:]]*([0-9]+[.)]|[-*])[[:space:]]+'; then
90
+ ENDS_WITH_PROMPT=1
91
+ ENDS_WITH_PROMPT_REASON="trailing-enumerated-list"
92
+ fi
93
+ fi
94
+
95
+ if [ "$ENDS_WITH_PROMPT" = "1" ]; then
96
+ echo "$LOG_TAG turn=$ASSISTANT_TURNS contract=ends-with-prompt result=pass reason=$ENDS_WITH_PROMPT_REASON" >&2
97
+ else
98
+ SAMPLE=$(echo "$TRIMMED" | tail -c 120 | tr '\n' ' ' | sed 's/[[:space:]]\+/ /g')
99
+ echo "$LOG_TAG turn=$ASSISTANT_TURNS contract=ends-with-prompt result=fail reason=$ENDS_WITH_PROMPT_REASON sample='${SAMPLE}'" >&2
98
100
  fi
99
101
 
100
102
  exit 0
@@ -1,6 +1,8 @@
1
- # Contextual UI Toolkit
1
+ # Contextual UI Toolkit (public agent surface only)
2
2
 
3
- A suite of UI primitives rendered inline in the conversation via `render-component`. Use these when structured interaction improves clarity, reduces ambiguity, or prevents errors not for every exchange.
3
+ **Scope.** This file documents the `render-component` UI primitives available exclusively on the public agent surface (Anthropic API runtime). The admin agent on the native Claude Code (PTY) surface does not have `render-component` and must not call it; admin flows use plain markdown for review and `file-attach` for downloadable artefacts (see `skills/file-presentation/SKILL.md`). The MCP tool definition remains registered because the public agent depends on it.
4
+
5
+ A suite of UI primitives rendered inline in the conversation via `render-component`. The public agent uses these when structured interaction improves clarity, reduces ambiguity, or prevents errors, not for every exchange.
4
6
 
5
7
  ## Component Catalogue
6
8
 
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  name: file-presentation
3
- description: "Render a file or document inline for the owner to view, edit, and download. Triggers when the owner asks to see, attach, or download a file, when content is generated that the owner needs to review (summary, report, draft), or when a downloadable artefact is the right output."
3
+ description: "Deliver a file or document to the owner inside chat for review and download. Triggers when the owner asks to see, attach, or download a file, when content is generated that the owner needs to review (summary, report, draft), or when a downloadable artefact is the right output."
4
4
  ---
5
5
 
6
6
  # File presentation
7
7
 
8
- This skill makes a file visible and downloadable inside the chat. It is the only sanctioned path for delivering file content to the owner. Synthesised content (a summary, a report, a draft) follows the same path: render via `document-editor` so the owner can review and download.
8
+ This skill makes a file visible and downloadable inside chat on the native Claude Code surface. Two delivery paths cover every case: a fenced markdown block for editable text content, and the `file-attach` tool for any file the operator should be able to download.
9
9
 
10
10
  ## The trigger
11
11
 
12
- The owner asks to view, review, attach, or download a file or a document, or the current turn produces a document that the owner needs to see. Example phrasings:
12
+ The owner asks to view, review, attach, or download a file or a document, or the current turn produces a document the owner needs to see. Example phrasings:
13
13
 
14
14
  - "show me the file"
15
15
  - "attach the report"
@@ -18,39 +18,23 @@ The owner asks to view, review, attach, or download a file or a document, or the
18
18
  - "send me the brochure"
19
19
  - "save that as a markdown file"
20
20
 
21
- ## How to render
21
+ ## How to deliver markdown text content
22
22
 
23
- Call `render-component` with:
23
+ For a synthesised document (a summary, a report, a draft, a knowledge-base article), present the content as a single fenced markdown block in chat:
24
24
 
25
+ ````
26
+ ```markdown
27
+ <the file content as markdown>
25
28
  ```
26
- name: "document-editor"
27
- data: {
28
- title: "<owner-facing title>",
29
- content: "<the file content as markdown>"
30
- }
31
- ```
32
-
33
- The component gives the owner a render-review-edit-download flow: they see the content inline, can edit it in place, and can download it as a `.md` file directly from the component. Do not use `memory-write`, `memory-ingest`, or other tools to deliver file content to the owner; those tools have different purposes and skipping the render-review-download flow takes control away from the owner.
34
-
35
- ## Character sanitisation: the silent-failure rule
36
-
37
- The document-editor's markdown parser fails silently on these typographical characters:
29
+ ````
38
30
 
39
- | Character | Unicode | Replace with |
40
- |---|---|---|
41
- | em-dash | U+2014 | hyphen with spaces |
42
- | en-dash | U+2013 | hyphen with spaces |
43
- | left curly double quote | U+201C | straight double quote |
44
- | right curly double quote | U+201D | straight double quote |
45
- | left curly single quote | U+2018 | straight single quote |
46
- | right curly single quote | U+2019 | straight single quote |
47
- | horizontal ellipsis | U+2026 | three periods |
31
+ The operator reads the block inline, copy-edits in their next message if changes are needed, and approves before any persistence step. Do not call `memory-write`, `memory-ingest`, or other writers before the operator has approved the content; those tools have different purposes and skipping the review step takes control away from the owner.
48
32
 
49
- Strip and replace these characters in the `content` field before the `render-component` call. The owner does not see a partial render or a warning; the content just silently breaks at the offending character. Currency symbols (£, ), accented characters, and other Unicode are unaffected: use them normally.
33
+ When the operator approves and the document should land on disk or in the graph, use the appropriate writer (`store-skill` for skill files under the active account, the relevant graph writer for `:KnowledgeDocument` nodes). Always state the destination before writing.
50
34
 
51
- ## When the file is a binary
35
+ ## How to deliver a downloadable file
52
36
 
53
- For PDF, image, audio, or any binary deliverable, use `file-attach` plus `render-component` with `name: file-attachment` and pass the returned path. The document-editor component is for editable markdown text only.
37
+ For any file the operator should be able to download (PDF, image, audio, a `.zip`, a `.md` artefact saved to disk, an `.ics` calendar export), call `file-attach` with the path. The tool returns the attachment reference and the chat client renders the download chip inline. No component wrapper is needed; `file-attach` is the delivery mechanism on the native Claude Code surface.
54
38
 
55
39
  ## For static-site delivery
56
40
 
@@ -58,10 +42,9 @@ When the owner has uploaded a `.zip` containing HTML and assets and wants it hos
58
42
 
59
43
  ## Failure modes
60
44
 
61
- - **Content is too large for the component** (typically over 50,000 characters of markdown). Surface the size and offer to split into sections, save as an attachment, or render only the first section with a follow-up for the rest.
62
- - **`render-component` returns an error.** Surface the error literally. Do not paste the content into chat as a fallback; the owner asked for the render-review-download flow, not a wall of text.
63
- - **The content contains characters the parser rejects after the sanitisation pass** (rare; usually a non-printable control character). Strip the offending characters and surface a one-line warning naming the position.
45
+ - **Content is too large for one chat block** (typically over 50,000 characters of markdown). Surface the size and offer to split into sections, save as a `.md` file and `file-attach` it, or present only the first section with a follow-up for the rest.
46
+ - **`file-attach` returns an error.** Surface the error literally. Do not paste binary contents or a base64 dump into chat as a fallback; the owner asked for a download, not a wall of bytes.
64
47
 
65
48
  ## What this skill does not do
66
49
 
67
- It does not write the content to the graph. It does not save the content to disk. The component handles the download path; the owner downloads what they edited in the component.
50
+ It does not write content to the graph or to disk on its own. The fenced-block path is a review surface; persistence is a separate, named tool call that follows operator approval.
@@ -42,7 +42,7 @@ Premium plugins are purchased separately and delivered from a staging area to th
42
42
 
43
43
  ### Browsing available premium plugins
44
44
 
45
- Call `premium-list`. It returns structured data for every plugin in the staging area: name, type (standalone/bundle), description, purchase status, and delivery status (per sub-plugin for bundles). Present the results using `render-component` with the `card` type.
45
+ Call `premium-list`. It returns structured data for every plugin in the staging area: name, type (standalone/bundle), description, purchase status, and delivery status (per sub-plugin for bundles). Present the results as a plain numbered list, one entry per plugin, naming the plugin, its type, its description, its purchase status, and (for bundles) the delivery status of each sub-plugin.
46
46
 
47
47
  ### Plugin info before purchase
48
48
 
@@ -92,7 +92,7 @@ Only present plugins from the curated list below. Before presenting, verify each
92
92
  | `sales` | Buying signal detection, closing techniques, objection handling |
93
93
  | `docs` | User guide and platform documentation |
94
94
 
95
- **Premium — Real Agency (only when delivered):**
95
+ **Premium — Real Agent (only when delivered):**
96
96
 
97
97
  | Plugin | Description |
98
98
  |--------|-------------|
@@ -5,7 +5,7 @@ tools: []
5
5
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
6
6
  ---
7
7
 
8
- # Real Agency — Brochures
8
+ # Real Agent — Brochures
9
9
 
10
10
  End-to-end estate-agent brochure pipeline. From an agent website URL and a property listing URL, the skills produce a print-ready A4 PDF brochure plus the live HTML used to author it. The pipeline is idempotent: each upstream step is skipped when its output already exists on disk for the requested source.
11
11
 
@@ -6,7 +6,7 @@ always: false
6
6
  metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
7
7
  ---
8
8
 
9
- # Real Agency — Buyer Management
9
+ # Real Agent — Buyer Management
10
10
 
11
11
  Five skills covering the complete buyer lifecycle from initial enquiry through viewing management and educational content.
12
12
 
@@ -28,7 +28,6 @@ The user is handling buyer enquiries, qualifying applicants, managing viewings,
28
28
 
29
29
  No MCP server. Skills operate via existing platform tools:
30
30
  - `memory-search` — retrieve domain knowledge from the knowledge base
31
- - `render-component` — present structured choices during interactions
32
31
 
33
32
  ## References
34
33
 
@@ -50,7 +50,7 @@ If the anchor is missing, ask for it in one sentence: "Mirror against the busine
50
50
  ## Chapter 2: ...
51
51
  ```
52
52
 
53
- Render the pack via `render-component name: document-editor` for owner review before saving. The owner can edit any chapter inline before the save. Once approved, write to the graph.
53
+ Present the assembled pack as a single fenced markdown block in chat for owner review before saving. The owner reads the pack inline and can ask for chapter-level edits in their next message. Once the owner approves, write to the graph.
54
54
 
55
55
  ## Length discipline
56
56
 
@@ -52,7 +52,7 @@ If `lens` is missing, ask once: "Through which lens: a project, a goal, or a pro
52
52
  ... (three to seven items)
53
53
  ```
54
54
 
55
- Render the pack via `render-component name: document-editor` for review before save.
55
+ Present the assembled pack as a single fenced markdown block in chat for owner review before save. The owner reads it inline and can ask for section-level edits in their next message. On approval, write to the graph.
56
56
 
57
57
  ## Difference from book-mirror
58
58
 
@@ -81,11 +81,11 @@ Brand decides which premium plugins ship. Maxy installs ship only `platform/plug
81
81
 
82
82
  **How it works:** Every boot {{productName}} delivers the brand's premium plugins from staging into `platform/plugins/` and stamps `enabledPlugins` against what is actually on disk. No conversation needed — the brand's full set is active from the first turn after install. Updates and reinstalls re-deliver from staging.
83
83
 
84
- Some premium plugins are **bundles** — multiple sub-plugins shipped under one directory in `premium-plugins/`, each independently activatable. For example, Real Agency ships 11 sub-plugins covering different aspects of estate agency work. They are all enabled by default. Sub-plugins you don't want active can be turned off individually with "disable <name>"; enabling or disabling individual sub-plugins does not affect the others.
84
+ Some premium plugins are **bundles** — multiple sub-plugins shipped under one directory in `premium-plugins/`, each independently activatable. For example, Real Agent ships 11 sub-plugins covering different aspects of estate agency work. They are all enabled by default. Sub-plugins you don't want active can be turned off individually with "disable <name>"; enabling or disabling individual sub-plugins does not affect the others.
85
85
 
86
86
  If you ask {{productName}} about a tool from a plugin your brand does not ship (for example, a Maxy install asking about a Real Agent Loop CRM tool), {{productName}} responds with a structured `<tool-surface-error>` envelope naming the missing plugin and the remedy, rather than improvising with a generic alternative.
87
87
 
88
- **Public agent embedding:** Premium plugins marked as public-eligible have their full content (skills and reference knowledge) embedded in public agent prompts. This means a public agent for a Real Agency member can handle buyer enquiries, book viewings, deliver coaching content, and onboard new applicants — all powered by the premium plugin's domain knowledge. Plugins marked admin-only (listings, vendors, leads, business) are only available to the account owner's admin agent.
88
+ **Public agent embedding:** Premium plugins marked as public-eligible have their full content (skills and reference knowledge) embedded in public agent prompts. This means a public agent for a Real Agent member can handle buyer enquiries, book viewings, deliver coaching content, and onboard new applicants — all powered by the premium plugin's domain knowledge. Plugins marked admin-only (listings, vendors, leads, business) are only available to the account owner's admin agent.
89
89
 
90
90
  Some premium plugins include specialist helpers that {{productName}} can dispatch for specific tasks (e.g. the writer-craft plugin includes a manuscript reviewer). These are activated automatically when the plugin is enabled.
91
91
 
@@ -30,7 +30,7 @@ always: false
30
30
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
31
31
  ---
32
32
 
33
- # Real Agency, Month-End and Business Operations
33
+ # Real Agent, Month-End and Business Operations
34
34
 
35
35
  Eight skills covering month-end close and commission (the master workflow plus three building blocks) and the existing business operations skills.
36
36
 
@@ -56,7 +56,6 @@ The user is asking for the monthly close, the commission run, reconciliation aga
56
56
  No MCP server. Skills operate via existing platform tools:
57
57
 
58
58
  - `memory-search` for domain knowledge
59
- - `render-component` for structured choices
60
59
  - `profile-read` and `profile-update` for the customisation profile
61
60
  - `action-pending`, `action-approve`, `action-reject`, `action-edit` for the writeoff, journal, payment-batch, and accountant-pack approval gates
62
61
 
@@ -6,7 +6,7 @@ always: false
6
6
  metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
7
7
  ---
8
8
 
9
- # Real Agency — Coaching & Development
9
+ # Real Agent — Coaching & Development
10
10
 
11
11
  Four skills covering people development — from individual coaching through team performance management and structured sales training.
12
12
 
@@ -48,7 +48,6 @@ Each skill inherits this boundary. When a conversation crosses from coaching int
48
48
 
49
49
  No MCP server. Skills operate via existing platform tools:
50
50
  - `memory-search` — retrieve domain knowledge from the knowledge base
51
- - `render-component` — present structured choices during interactions
52
51
 
53
52
  ## References
54
53
 
@@ -6,7 +6,7 @@ always: false
6
6
  metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
7
7
  ---
8
8
 
9
- # Real Agency — Onboarding
9
+ # Real Agent — Onboarding
10
10
 
11
11
  First-run member setup — turning a new conversation into a profiled member with a clear starting point in the curriculum.
12
12
 
@@ -24,7 +24,6 @@ The user is going through initial onboarding (career stage assessment, profile s
24
24
 
25
25
  No MCP server. Skills operate via existing platform tools:
26
26
  - `memory-search` — retrieve domain knowledge from the knowledge base
27
- - `render-component` — present structured choices during interactions
28
27
 
29
28
  ## References
30
29
 
@@ -19,7 +19,7 @@ always: false
19
19
  metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
20
20
  ---
21
21
 
22
- # Real Agency, Chase Progression and Sales
22
+ # Real Agent, Chase Progression and Sales
23
23
 
24
24
  Seven skills covering chain progression (the headline workflow) and the existing sales cycle.
25
25
 
@@ -44,7 +44,6 @@ The user is working on stalled deals, chain progression, fall-through risk, sale
44
44
  No MCP server. Skills operate via existing platform tools:
45
45
 
46
46
  - `memory-search` for domain knowledge
47
- - `render-component` for structured choices
48
47
  - `profile-read` and `profile-update` for the customisation profile
49
48
  - `action-pending`, `action-approve`, `action-reject`, `action-edit` for the per-message approval gates in chase-progression
50
49
 
@@ -6,7 +6,7 @@ always: false
6
6
  metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
7
7
  ---
8
8
 
9
- # Real Agency — Teaching & Content
9
+ # Real Agent — Teaching & Content
10
10
 
11
11
  Structured content delivery from the Real Agency curriculum. Handles module browsing, topic search, interactive teaching, and progress tracking.
12
12
 
@@ -24,7 +24,6 @@ The user is browsing available content, asking about a topic, requesting a speci
24
24
 
25
25
  No MCP server. Skills operate via existing platform tools:
26
26
  - `memory-search` — retrieve domain knowledge from the knowledge base
27
- - `render-component` — present structured choices during interactions
28
27
 
29
28
  ## References
30
29
 
@@ -29,7 +29,7 @@ always: false
29
29
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
30
30
  ---
31
31
 
32
- # Real Agency, Lead Generation and Morning Round
32
+ # Real Agent, Lead Generation and Morning Round
33
33
 
34
34
  Six skills: four covering the daily morning round (master plus building blocks) and two covering longer-horizon lead nurturing and prospecting.
35
35
 
@@ -53,7 +53,6 @@ The user is asking for the morning round, the daily brief, the day's diary, over
53
53
  No MCP server. Skills operate via existing platform tools:
54
54
 
55
55
  - `memory-search` to retrieve domain knowledge from the knowledge base
56
- - `render-component` to present structured choices during interactions
57
56
  - `profile-read` and `profile-update` for the customisation profile
58
57
  - `task-create` to file an open task when a chase needs deferring
59
58
 
@@ -61,7 +61,7 @@ always: false
61
61
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
62
62
  ---
63
63
 
64
- # Real Agency, Valuations and New Instructions
64
+ # Real Agent, Valuations and New Instructions
65
65
 
66
66
  Fifteen skills covering the two listings-side master workflows (valuation-prep, new-instruction) plus the listing-presentation and marketing skills.
67
67
 
@@ -94,7 +94,6 @@ The user is preparing for a valuation or market appraisal, has just won an instr
94
94
  No MCP server. Skills operate via existing platform tools:
95
95
 
96
96
  - `memory-search` for domain knowledge
97
- - `render-component` for structured choices
98
97
  - `profile-read` and `profile-update` for the customisation profile
99
98
  - `action-pending`, `action-approve`, `action-reject`, `action-edit` for the eight approval gates in new-instruction
100
99
 
@@ -73,7 +73,7 @@ always: false
73
73
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
74
74
  ---
75
75
 
76
- # Real Agency — Loop CRM
76
+ # Real Agent — Loop CRM
77
77
 
78
78
  Full integration with Loop CRM V2 API (api.loop.software). Covers all 73 endpoints across 8 resource groups — properties, people, viewings, feedback, team, marketing, customer preferences, and supplier operations. Supports both read and write operations.
79
79
 
@@ -104,7 +104,7 @@ The `sessionKey` parameter on `schedule-event` automatically creates the `PART_O
104
104
 
105
105
  ## ICS calendar files
106
106
 
107
- Export events as `.ics` files so users can add them to Apple Calendar, Google Calendar, or Outlook. Use `schedule-export-ics` with the event IDs, then `file-attach` with the returned path and `render-component file-attachment` to deliver the download.
107
+ Export events as `.ics` files so users can add them to Apple Calendar, Google Calendar, or Outlook. Use `schedule-export-ics` with the event IDs, then `file-attach` with the returned path; the chat client renders the download chip inline.
108
108
 
109
109
  Import `.ics` files uploaded by the user. Use `schedule-import-ics` with the attachment path. Present the extracted events for confirmation before creating them via `schedule-event`.
110
110
 
@@ -6,7 +6,7 @@ always: false
6
6
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
7
7
  ---
8
8
 
9
- # Real Agency — Vendor Management
9
+ # Real Agent — Vendor Management
10
10
 
11
11
  Four skills covering the active vendor lifecycle from valuation enquiry through offer negotiation.
12
12
 
@@ -27,7 +27,6 @@ The user is managing vendor relationships — handling valuation requests, provi
27
27
 
28
28
  No MCP server. Skills operate via existing platform tools:
29
29
  - `memory-search` — retrieve domain knowledge from the knowledge base
30
- - `render-component` — present structured choices during interactions
31
30
 
32
31
  ## References
33
32
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: real-agent
3
- description: "UK estate agency skills + Loop CRM integration — 11 sub-plugins covering sales, listings, vendor management, buyer management, lead generation, coaching, business operations, onboarding, teaching, Loop CRM, and property brochures. 3 specialist roles (negotiator, valuer, compliance). 32 skills + 22 MCP tools."
3
+ description: "UK estate agency skills + Loop CRM integration — 11 sub-plugins covering sales, listings, vendor management, buyer management, lead generation, coaching, business operations, onboarding, teaching, Loop CRM, and property brochures. 3 specialist roles (negotiator, valuer, compliance). 32 skills + 23 MCP tools."
4
4
  plugins:
5
5
  - estate-sales
6
6
  - listings
@@ -23,9 +23,9 @@ Premium plugin bundle for UK estate agency professionals. Shipped on every non-M
23
23
 
24
24
  | Role | Agent file | Tools | Focus |
25
25
  |---|---|---|---|
26
- | Negotiator | `agents/negotiator.md` | All Loop CRM tools + memory-search + render-component | Buyer pipeline, viewings, feedback, offers, deal progression |
27
- | Valuer | `agents/valuer.md` | Loop property/people tools + memory-search + render-component | Market appraisal preparation, comparable evidence analysis |
28
- | Compliance | `agents/compliance.md` | All Loop CRM tools + memory-search + perplexity-search + render-component | UK estate agency law, listing audit, AML/KYC, regulatory compliance |
26
+ | Negotiator | `agents/negotiator.md` | All Loop CRM tools + memory-search | Buyer pipeline, viewings, feedback, offers, deal progression |
27
+ | Valuer | `agents/valuer.md` | Loop property/people tools + memory-search | Market appraisal preparation, comparable evidence analysis |
28
+ | Compliance | `agents/compliance.md` | All Loop CRM tools + memory-search + perplexity-search | UK estate agency law, listing audit, AML/KYC, regulatory compliance |
29
29
 
30
30
  ## Sub-Plugins
31
31
 
@@ -40,5 +40,5 @@ Premium plugin bundle for UK estate agency professionals. Shipped on every non-M
40
40
  | `estate-business` | 4 | — | Business owner skills — growth, operations, brand, partnerships |
41
41
  | `estate-onboarding` | 1 | — | First-run member onboarding |
42
42
  | `estate-teaching` | 1 | — | Structured education module browsing and delivery |
43
- | `loop` | — | 22 | Loop CRM integration — properties, people, viewings, feedback, team, marketing, customer preferences, supplier |
43
+ | `loop` | — | 23 | Loop CRM integration — properties, people, viewings, feedback, team, marketing, customer preferences, supplier |
44
44
  | `brochures` | 5 | — | Property brochure pipeline — brand extract, property extract, A4 layout, print constraints |
@@ -3,7 +3,7 @@ name: compliance
3
3
  description: "UK estate agency legal and compliance guidance — legislation, regulation, codes of practice, AML obligations, consumer protection, data protection, material information, advertising standards, and lettings law. Delegate when the task involves regulatory compliance, legal obligations, listing audit against legislative requirements, AML/KYC procedures, data handling questions, advertising rules, or any question about what the law requires of an estate agent or letting agent."
4
4
  summary: "Your compliance officer — advises on UK estate agency law, audits listings against regulatory requirements, and cites current legislation."
5
5
  model: claude-opus-4-7
6
- tools: mcp__loop__loop-key-register, mcp__loop__loop-key-deregister, mcp__loop__loop-key-list, mcp__loop__loop-people-search, mcp__loop__loop-people-detail, mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-property-request, mcp__loop__loop-viewing-search, mcp__loop__loop-viewing-detail, mcp__loop__loop-viewing-create, mcp__loop__loop-viewing-update, mcp__loop__loop-feedback-get, mcp__loop__loop-feedback-submit, mcp__loop__loop-team-info, mcp__loop__loop-team-availability, mcp__loop__loop-marketing-match, mcp__loop__loop-marketing-match-batch, mcp__loop__loop-marketing-match-request, mcp__loop__loop-marketing-enquiry, mcp__loop__loop-customer-preferences, mcp__loop__loop-supplier, mcp__memory__memory-search, mcp__deep-research__perplexity-search, mcp__admin__render-component
6
+ tools: mcp__loop__loop-key-register, mcp__loop__loop-key-deregister, mcp__loop__loop-key-list, mcp__loop__loop-people-search, mcp__loop__loop-people-detail, mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-property-request, mcp__loop__loop-viewing-search, mcp__loop__loop-viewing-detail, mcp__loop__loop-viewing-create, mcp__loop__loop-viewing-update, mcp__loop__loop-feedback-get, mcp__loop__loop-feedback-submit, mcp__loop__loop-team-info, mcp__loop__loop-team-availability, mcp__loop__loop-marketing-match, mcp__loop__loop-marketing-match-batch, mcp__loop__loop-marketing-match-request, mcp__loop__loop-marketing-enquiry, mcp__loop__loop-customer-preferences, mcp__loop__loop-supplier, mcp__memory__memory-search, mcp__deep-research__perplexity-search
7
7
  ---
8
8
 
9
9
  # Compliance
@@ -3,7 +3,7 @@ name: negotiator
3
3
  description: "CRM operations, buyer pipeline management, viewing coordination, feedback analysis, offer preparation, and deal progression. Delegate when the task involves querying or correlating CRM data, managing buyer interactions, preparing offer packages, or tracking deal status."
4
4
  summary: "Your negotiator — manages buyer pipeline, viewings, feedback, offers, and deal progression using Loop CRM."
5
5
  model: claude-sonnet-4-6
6
- tools: mcp__loop__loop-key-register, mcp__loop__loop-key-deregister, mcp__loop__loop-key-list, mcp__loop__loop-people-search, mcp__loop__loop-people-detail, mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-property-request, mcp__loop__loop-viewing-search, mcp__loop__loop-viewing-detail, mcp__loop__loop-viewing-create, mcp__loop__loop-viewing-update, mcp__loop__loop-feedback-get, mcp__loop__loop-feedback-submit, mcp__loop__loop-team-info, mcp__loop__loop-team-availability, mcp__loop__loop-marketing-match, mcp__loop__loop-marketing-match-batch, mcp__loop__loop-marketing-match-request, mcp__loop__loop-marketing-enquiry, mcp__loop__loop-customer-preferences, mcp__loop__loop-supplier, mcp__memory__memory-search, mcp__admin__render-component
6
+ tools: mcp__loop__loop-key-register, mcp__loop__loop-key-deregister, mcp__loop__loop-key-list, mcp__loop__loop-people-search, mcp__loop__loop-people-detail, mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-property-request, mcp__loop__loop-viewing-search, mcp__loop__loop-viewing-detail, mcp__loop__loop-viewing-create, mcp__loop__loop-viewing-update, mcp__loop__loop-feedback-get, mcp__loop__loop-feedback-submit, mcp__loop__loop-team-info, mcp__loop__loop-team-availability, mcp__loop__loop-marketing-match, mcp__loop__loop-marketing-match-batch, mcp__loop__loop-marketing-match-request, mcp__loop__loop-marketing-enquiry, mcp__loop__loop-customer-preferences, mcp__loop__loop-supplier, mcp__memory__memory-search
7
7
  ---
8
8
 
9
9
  # Negotiator
@@ -3,7 +3,7 @@ name: valuer
3
3
  description: "Market appraisal preparation, comparable evidence analysis, and valuation booking support. Delegate when the task involves preparing for a valuation appointment, assembling comparable sales data, analysing competing listings, or handling valuation enquiries."
4
4
  summary: "Your valuer — prepares market appraisals, assembles comparable evidence, and analyses local market conditions using Loop CRM."
5
5
  model: claude-sonnet-4-6
6
- tools: mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-people-search, mcp__memory__memory-search, mcp__admin__render-component
6
+ tools: mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-people-search, mcp__memory__memory-search
7
7
  ---
8
8
 
9
9
  # Valuer
@@ -5,7 +5,7 @@ tools: []
5
5
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
6
6
  ---
7
7
 
8
- # Real Agency — Brochures
8
+ # Real Agent — Brochures
9
9
 
10
10
  End-to-end estate-agent brochure pipeline. From an agent website URL and a property listing URL, the skills produce a print-ready A4 PDF brochure plus the live HTML used to author it. The pipeline is idempotent: each upstream step is skipped when its output already exists on disk for the requested source.
11
11
 
@@ -6,7 +6,7 @@ always: false
6
6
  metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
7
7
  ---
8
8
 
9
- # Real Agency — Buyer Management
9
+ # Real Agent — Buyer Management
10
10
 
11
11
  Five skills covering the complete buyer lifecycle from initial enquiry through viewing management and educational content.
12
12
 
@@ -28,7 +28,6 @@ The user is handling buyer enquiries, qualifying applicants, managing viewings,
28
28
 
29
29
  No MCP server. Skills operate via existing platform tools:
30
30
  - `memory-search` — retrieve domain knowledge from the knowledge base
31
- - `render-component` — present structured choices during interactions
32
31
 
33
32
  ## References
34
33
 
@@ -30,7 +30,7 @@ always: false
30
30
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
31
31
  ---
32
32
 
33
- # Real Agency, Month-End and Business Operations
33
+ # Real Agent, Month-End and Business Operations
34
34
 
35
35
  Eight skills covering month-end close and commission (the master workflow plus three building blocks) and the existing business operations skills.
36
36
 
@@ -56,7 +56,6 @@ The user is asking for the monthly close, the commission run, reconciliation aga
56
56
  No MCP server. Skills operate via existing platform tools:
57
57
 
58
58
  - `memory-search` for domain knowledge
59
- - `render-component` for structured choices
60
59
  - `profile-read` and `profile-update` for the customisation profile
61
60
  - `action-pending`, `action-approve`, `action-reject`, `action-edit` for the writeoff, journal, payment-batch, and accountant-pack approval gates
62
61
 
@@ -6,7 +6,7 @@ always: false
6
6
  metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
7
7
  ---
8
8
 
9
- # Real Agency — Coaching & Development
9
+ # Real Agent — Coaching & Development
10
10
 
11
11
  Four skills covering people development — from individual coaching through team performance management and structured sales training.
12
12
 
@@ -48,7 +48,6 @@ Each skill inherits this boundary. When a conversation crosses from coaching int
48
48
 
49
49
  No MCP server. Skills operate via existing platform tools:
50
50
  - `memory-search` — retrieve domain knowledge from the knowledge base
51
- - `render-component` — present structured choices during interactions
52
51
 
53
52
  ## References
54
53
 
@@ -6,7 +6,7 @@ always: false
6
6
  metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
7
7
  ---
8
8
 
9
- # Real Agency — Onboarding
9
+ # Real Agent — Onboarding
10
10
 
11
11
  First-run member setup — turning a new conversation into a profiled member with a clear starting point in the curriculum.
12
12
 
@@ -24,7 +24,6 @@ The user is going through initial onboarding (career stage assessment, profile s
24
24
 
25
25
  No MCP server. Skills operate via existing platform tools:
26
26
  - `memory-search` — retrieve domain knowledge from the knowledge base
27
- - `render-component` — present structured choices during interactions
28
27
 
29
28
  ## References
30
29
 
@@ -19,7 +19,7 @@ always: false
19
19
  metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
20
20
  ---
21
21
 
22
- # Real Agency, Chase Progression and Sales
22
+ # Real Agent, Chase Progression and Sales
23
23
 
24
24
  Seven skills covering chain progression (the headline workflow) and the existing sales cycle.
25
25
 
@@ -44,7 +44,6 @@ The user is working on stalled deals, chain progression, fall-through risk, sale
44
44
  No MCP server. Skills operate via existing platform tools:
45
45
 
46
46
  - `memory-search` for domain knowledge
47
- - `render-component` for structured choices
48
47
  - `profile-read` and `profile-update` for the customisation profile
49
48
  - `action-pending`, `action-approve`, `action-reject`, `action-edit` for the per-message approval gates in chase-progression
50
49
 
@@ -6,7 +6,7 @@ always: false
6
6
  metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
7
7
  ---
8
8
 
9
- # Real Agency — Teaching & Content
9
+ # Real Agent — Teaching & Content
10
10
 
11
11
  Structured content delivery from the Real Agency curriculum. Handles module browsing, topic search, interactive teaching, and progress tracking.
12
12
 
@@ -24,7 +24,6 @@ The user is browsing available content, asking about a topic, requesting a speci
24
24
 
25
25
  No MCP server. Skills operate via existing platform tools:
26
26
  - `memory-search` — retrieve domain knowledge from the knowledge base
27
- - `render-component` — present structured choices during interactions
28
27
 
29
28
  ## References
30
29
 
@@ -29,7 +29,7 @@ always: false
29
29
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
30
30
  ---
31
31
 
32
- # Real Agency, Lead Generation and Morning Round
32
+ # Real Agent, Lead Generation and Morning Round
33
33
 
34
34
  Six skills: four covering the daily morning round (master plus building blocks) and two covering longer-horizon lead nurturing and prospecting.
35
35
 
@@ -53,7 +53,6 @@ The user is asking for the morning round, the daily brief, the day's diary, over
53
53
  No MCP server. Skills operate via existing platform tools:
54
54
 
55
55
  - `memory-search` to retrieve domain knowledge from the knowledge base
56
- - `render-component` to present structured choices during interactions
57
56
  - `profile-read` and `profile-update` for the customisation profile
58
57
  - `task-create` to file an open task when a chase needs deferring
59
58
 
@@ -61,7 +61,7 @@ always: false
61
61
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
62
62
  ---
63
63
 
64
- # Real Agency, Valuations and New Instructions
64
+ # Real Agent, Valuations and New Instructions
65
65
 
66
66
  Fifteen skills covering the two listings-side master workflows (valuation-prep, new-instruction) plus the listing-presentation and marketing skills.
67
67
 
@@ -94,7 +94,6 @@ The user is preparing for a valuation or market appraisal, has just won an instr
94
94
  No MCP server. Skills operate via existing platform tools:
95
95
 
96
96
  - `memory-search` for domain knowledge
97
- - `render-component` for structured choices
98
97
  - `profile-read` and `profile-update` for the customisation profile
99
98
  - `action-pending`, `action-approve`, `action-reject`, `action-edit` for the eight approval gates in new-instruction
100
99
 
@@ -73,7 +73,7 @@ always: false
73
73
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
74
74
  ---
75
75
 
76
- # Real Agency — Loop CRM
76
+ # Real Agent — Loop CRM
77
77
 
78
78
  Full integration with Loop CRM V2 API (api.loop.software). Covers all 73 endpoints across 8 resource groups — properties, people, viewings, feedback, team, marketing, customer preferences, and supplier operations. Supports both read and write operations.
79
79
 
@@ -6,7 +6,7 @@ always: false
6
6
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
7
7
  ---
8
8
 
9
- # Real Agency — Vendor Management
9
+ # Real Agent — Vendor Management
10
10
 
11
11
  Four skills covering the active vendor lifecycle from valuation enquiry through offer negotiation.
12
12
 
@@ -27,7 +27,6 @@ The user is managing vendor relationships — handling valuation requests, provi
27
27
 
28
28
  No MCP server. Skills operate via existing platform tools:
29
29
  - `memory-search` — retrieve domain knowledge from the knowledge base
30
- - `render-component` — present structured choices during interactions
31
30
 
32
31
  ## References
33
32