claude-flow-novice 2.18.23 → 2.18.25

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 (39) hide show
  1. package/.claude/CLAUDE.md +17 -0
  2. package/.claude/commands/cfn-loop/cfn-loop-cli.md +9 -0
  3. package/.claude/commands/cfn-loop-task.md +11 -0
  4. package/.claude/commands/cfn-ruvector/cfn-codebase-reindex.md +23 -4
  5. package/.claude/commands/cfn-ruvector/cfn-codebase-search.md +10 -2
  6. package/.claude/commands/cfn-ruvector/cfn-detect-stale-docs.md +22 -4
  7. package/.claude/hooks/deprecated/cfn-SessionStart-cfn-load-openai-key.sh +48 -0
  8. package/.claude/settings.json +6 -8
  9. package/.claude/skills/CLAUDE.md +70 -0
  10. package/.claude/skills/cfn-local-ruvector-accelerator/SKILL.md +37 -21
  11. package/CLAUDE.md +63 -401
  12. package/config/agent-whitelist.json +281 -0
  13. package/config/default.yml +180 -0
  14. package/config/feature-flags.json +315 -0
  15. package/config/fix-reports/config-manager-custom-keys.json +15 -0
  16. package/config/hooks/post-edit-pipeline.js +858 -0
  17. package/config/hooks/post-edit-pipeline.js.original +612 -0
  18. package/config/kong/grafana/datasources/prometheus.yml +24 -0
  19. package/config/kong/kong.yml +496 -0
  20. package/config/kong/prometheus.yml +49 -0
  21. package/config/logrotate.d/cfn-logs +221 -0
  22. package/config/loki/loki-config.yml +172 -0
  23. package/config/loki/retention.yml +107 -0
  24. package/config/mcp-servers.json +152 -0
  25. package/config/production.yml.example +72 -0
  26. package/config/prometheus.yml +85 -0
  27. package/config/promtail/promtail-config.yml +162 -0
  28. package/config/redis.conf +33 -0
  29. package/config/redis.config.js +115 -0
  30. package/config/skill-requirements.json +341 -0
  31. package/config/sla-definitions.test.yml +66 -0
  32. package/config/sla-definitions.yml +150 -0
  33. package/docs/CFN_LOOP_CLI_MODE.md +134 -0
  34. package/package.json +1 -1
  35. package/scripts/cfn-init.js +8 -2
  36. package/.claude/hooks/SessionStart-cfn-load-openai-key.sh +0 -35
  37. package/.claude/hooks/SessionStart:cfn-build-ruvector.sh +0 -28
  38. /package/.claude/hooks/{SessionStart-cfn-build-ruvector.sh → cfn-SessionStart-cfn-build-ruvector.sh} +0 -0
  39. /package/.claude/hooks/{cfn-load-cerebras-env.sh → deprecated/cfn-load-cerebras-env.sh} +0 -0
@@ -0,0 +1,17 @@
1
+ # CFN Coordination and Namespace Guide
2
+
3
+ ## Coordination Patterns and Namespace Isolation
4
+
5
+ - Coordination patterns: see `.claude/skills/cfn-coordination/SKILL.md` (chain, broadcast, mesh, consensus collection).
6
+ - Namespace structure: agents `.claude/agents/cfn-dev-team/`; skills `.claude/skills/cfn-*/`; hooks `.claude/hooks/cfn-*`; commands `.claude/commands/cfn/`.
7
+ - Enhanced orchestrator v3.0: `./.claude/skills/cfn-loop-orchestration/orchestrate.sh`
8
+ - Orchestration flow: Loop 3 executes and tests -> gate check -> Loop 2 validators -> Product Owner decision (PROCEED/ITERATE/ABORT) -> iterate or finish.
9
+ - Task mode agents: return output directly; no Redis signaling.
10
+
11
+ ### Coordination Anti-Patterns (avoid)
12
+
13
+ - Skipping gate check before spawning Loop 2.
14
+ - Validators reviewing without tests/logs.
15
+ - Product Owner decision without deliverable paths.
16
+ - Mixing service and container names inside Docker networks.
17
+ - Manual cleanup instead of orchestrator controls.
@@ -265,6 +265,15 @@ The orchestrator returns structured results:
265
265
  }
266
266
  ```
267
267
 
268
+ ## Validation Flow Summary
269
+
270
+ 1. **Loop 3 Gate:** Test pass rate must meet mode threshold before validators start
271
+ 2. **Loop 2 Validators:** Need access to Loop 3 outputs, tests, and logs
272
+ 3. **Product Owner Decision:** Parsed via `.claude/skills/product-owner-decision/execute-decision.sh`
273
+ 4. **Gate Failure:** Iterate Loop 3 only
274
+ 5. **Gate Pass:** Proceed to validators
275
+ 6. **Decision Outcomes:** PROCEED (done), ITERATE (repeat), ABORT (stop with error)
276
+
268
277
  This simplified architecture provides:
269
278
  - ✅ **Zero external dependencies** - runs anywhere Node.js is available
270
279
  - ✅ **Fast execution** - parallel decomposition and implementation
@@ -249,6 +249,17 @@ fi
249
249
 
250
250
  ---
251
251
 
252
+ ## Validation Flow Summary
253
+
254
+ 1. **Loop 3 Gate:** Test pass rate must meet mode threshold before validators start
255
+ 2. **Loop 2 Validators:** Need access to Loop 3 outputs, tests, and logs
256
+ 3. **Product Owner Decision:** Parsed via `.claude/skills/product-owner-decision/execute-decision.sh`
257
+ 4. **Gate Failure:** Iterate Loop 3 only
258
+ 5. **Gate Pass:** Proceed to validators
259
+ 6. **Decision Outcomes:** PROCEED (done), ITERATE (repeat), ABORT (stop with error)
260
+
261
+ ---
262
+
252
263
  ## Related Documentation
253
264
 
254
265
  - **Full Task Mode Guide**: `.claude/commands/cfn-loop/cfn-loop-task.md`
@@ -17,20 +17,39 @@ Add `--force` flag for complete reindex:
17
17
  - Major restructuring
18
18
  - Index issues
19
19
 
20
- **Prerequisites:**
21
- - OPENAI_API_KEY must be set: `export OPENAI_API_KEY="sk-..."`
20
+ **Log file:** `/tmp/ruvector-index.log` - tail this for progress monitoring.
22
21
 
23
22
  ---
24
23
 
25
24
  Execute reindex:
26
25
 
27
26
  ```bash
27
+ # --- FAIL-FAST: Validate OpenAI API Key ---
28
+ # Always load from .env if current key is invalid (placeholder or missing)
29
+ if [[ ! "$OPENAI_API_KEY" =~ ^sk- ]] && [[ -f ".env" ]]; then
30
+ export OPENAI_API_KEY=$(grep "^OPENAI_API_KEY=" .env | cut -d'=' -f2- | tr -d '"' | tr -d "'")
31
+ fi
32
+
33
+ # Final validation
34
+ if [[ ! "$OPENAI_API_KEY" =~ ^sk- ]]; then
35
+ echo "❌ FATAL: Valid OPENAI_API_KEY not found." >&2
36
+ echo " Add to .env: OPENAI_API_KEY=sk-..." >&2
37
+ exit 1
38
+ fi
39
+
40
+ echo "✅ OpenAI key: ${OPENAI_API_KEY:0:12}..."
41
+
42
+ # --- Setup ---
28
43
  RUVECTOR_BIN="${HOME}/.local/bin/local-ruvector"
29
44
  [ ! -f "$RUVECTOR_BIN" ] && RUVECTOR_BIN="./.claude/skills/cfn-local-ruvector-accelerator/target/release/local-ruvector"
45
+ LOG_FILE="/tmp/ruvector-index.log"
46
+
47
+ echo "📝 Logging to: $LOG_FILE"
48
+ echo " Monitor with: tail -f $LOG_FILE"
30
49
 
31
50
  # Incremental (default - only changed files)
32
- "$RUVECTOR_BIN" index --path . --types rs,ts,js,py,sh,md
51
+ "$RUVECTOR_BIN" index --path . --types rs,ts,js,py,sh,md 2>&1 | tee "$LOG_FILE"
33
52
 
34
53
  # Full rebuild (when needed)
35
- # "$RUVECTOR_BIN" index --path . --types rs,ts,js,py,sh,md --force
54
+ # "$RUVECTOR_BIN" index --path . --types rs,ts,js,py,sh,md --force 2>&1 | tee "$LOG_FILE"
36
55
  ```
@@ -19,7 +19,7 @@ Search your indexed codebase using RuVector. Uses SQLite index for fast lookups.
19
19
  - `/cfn-ruvector:cfn-codebase-search database migration`
20
20
 
21
21
  **Prerequisites:**
22
- - Codebase must be indexed: `./local-ruvector index --path . --force`
22
+ - Codebase must be indexed: `/cfn-codebase-reindex`
23
23
  - OPENAI_API_KEY must be set for indexing
24
24
 
25
25
  ---
@@ -27,7 +27,15 @@ Search your indexed codebase using RuVector. Uses SQLite index for fast lookups.
27
27
  Execute the search:
28
28
 
29
29
  ```bash
30
+ # Load from .env if current key is invalid
31
+ if [[ ! "$OPENAI_API_KEY" =~ ^sk- ]] && [[ -f ".env" ]]; then
32
+ export OPENAI_API_KEY=$(grep "^OPENAI_API_KEY=" .env | cut -d'=' -f2- | tr -d '"' | tr -d "'")
33
+ fi
34
+ [[ ! "$OPENAI_API_KEY" =~ ^sk- ]] && { echo "❌ OPENAI_API_KEY invalid. Add to .env" >&2; exit 1; }
35
+
30
36
  RUVECTOR_BIN="${HOME}/.local/bin/local-ruvector"
31
37
  [ ! -f "$RUVECTOR_BIN" ] && RUVECTOR_BIN="./.claude/skills/cfn-local-ruvector-accelerator/target/release/local-ruvector"
32
- "$RUVECTOR_BIN" query "{{query}}" --max-results {{#if top}}{{top}}{{else}}10{{/if}}
38
+
39
+ # Use threshold 0.1 for better results (default 0.3 is too strict)
40
+ "$RUVECTOR_BIN" query "{{query}}" --max-results {{#if top}}{{top}}{{else}}10{{/if}} --threshold 0.1
33
41
  ```
@@ -29,13 +29,31 @@ Analyzes all `.md` files in the codebase to detect legacy/outdated documentation
29
29
  - Score 2-4: **POSSIBLY STALE** (minor issues)
30
30
 
31
31
  **Prerequisites:**
32
- - Codebase must be indexed first (`/codebase-reindex`)
33
- - ZAI_API_KEY must be set (for semantic search)
32
+ - Codebase must be indexed first (`/cfn-codebase-reindex`)
33
+ - OPENAI_API_KEY must be set (for semantic search)
34
34
 
35
35
  ---
36
36
 
37
- Run the stale documentation detector:
37
+ **Note:** This is a planned feature. Currently use these manual queries:
38
38
 
39
39
  ```bash
40
- ./.claude/skills/cfn-ruvector-codebase-index/detect-stale-docs.sh
40
+ # Find docs older than 90 days with no recent code references
41
+ sqlite3 ~/.local/share/ruvector/index_v2.db "
42
+ SELECT e.file_path, e.name,
43
+ datetime(e.created_at, 'unixepoch') as indexed_at
44
+ FROM entities e
45
+ WHERE e.file_path LIKE '%.md'
46
+ AND e.project_root LIKE '%$(pwd)%'
47
+ AND (e.name LIKE '%legacy%' OR e.name LIKE '%deprecated%' OR e.name LIKE '%old%')
48
+ LIMIT 20;"
49
+
50
+ # Find orphan docs (no references)
51
+ sqlite3 ~/.local/share/ruvector/index_v2.db "
52
+ SELECT DISTINCT e.file_path
53
+ FROM entities e
54
+ LEFT JOIN refs r ON e.id = r.source_entity_id OR e.id = r.target_entity_id
55
+ WHERE e.file_path LIKE '%.md'
56
+ AND e.project_root LIKE '%$(pwd)%'
57
+ AND r.id IS NULL
58
+ LIMIT 20;"
41
59
  ```
@@ -0,0 +1,48 @@
1
+ #!/bin/bash
2
+
3
+ # SessionStart hook: Load OpenAI API key from root .env file
4
+ # This ensures OPENAI_API_KEY is available for embedding generation
5
+ #
6
+ # IMPORTANT: SessionStart hooks must write to CLAUDE_ENV_FILE to set env vars.
7
+ # JSON output and 'export' do NOT work - only CLAUDE_ENV_FILE persists.
8
+
9
+ set -e
10
+
11
+ # Path to root .env file
12
+ ROOT_ENV="${PROJECT_ROOT:-.}/.env"
13
+
14
+ # Check if CLAUDE_ENV_FILE is available (only in SessionStart hooks)
15
+ if [[ -z "$CLAUDE_ENV_FILE" ]]; then
16
+ echo "⚠️ CLAUDE_ENV_FILE not set - not running as SessionStart hook" >&2
17
+ exit 0
18
+ fi
19
+
20
+ # Check if .env exists
21
+ if [[ ! -f "$ROOT_ENV" ]]; then
22
+ echo "⚠️ Warning: $ROOT_ENV not found. OpenAI embeddings will not work." >&2
23
+ exit 0
24
+ fi
25
+
26
+ # Extract OPENAI_API_KEY from .env
27
+ if grep -q "^OPENAI_API_KEY=" "$ROOT_ENV"; then
28
+ OPENAI_KEY=$(grep "^OPENAI_API_KEY=" "$ROOT_ENV" | cut -d'=' -f2- | tr -d '"' | tr -d "'")
29
+
30
+ # Validate key format
31
+ if [[ -z "$OPENAI_KEY" ]]; then
32
+ echo "⚠️ Warning: OPENAI_API_KEY found but empty in $ROOT_ENV" >&2
33
+ exit 0
34
+ fi
35
+
36
+ if [[ ! "$OPENAI_KEY" =~ ^sk- ]]; then
37
+ echo "⚠️ Warning: OPENAI_API_KEY invalid format (must start with 'sk-')" >&2
38
+ exit 0
39
+ fi
40
+
41
+ # Write to CLAUDE_ENV_FILE - this is how SessionStart hooks set env vars
42
+ echo "export OPENAI_API_KEY=\"$OPENAI_KEY\"" >> "$CLAUDE_ENV_FILE"
43
+ echo "✅ Loaded OPENAI_API_KEY from .env (${OPENAI_KEY:0:10}...)" >&2
44
+ else
45
+ echo "⚠️ Warning: OPENAI_API_KEY not found in $ROOT_ENV. OpenAI embeddings will not work." >&2
46
+ fi
47
+
48
+ exit 0
@@ -153,23 +153,21 @@
153
153
  }
154
154
  ],
155
155
  "SessionStart": [
156
- {
156
+ {
157
+ "matcher": "startup",
157
158
  "hooks": [
158
159
  {
159
160
  "type": "command",
160
- "command": "bash -c 'echo \"[SessionStart] Initializing session context...\" >&2; if [ -f \"./.claude/hooks/cfn-load-cerebras-env.sh\" ]; then RESULT=$(./.claude/hooks/cfn-load-cerebras-env.sh 2>&1); if echo \"$RESULT\" | jq . >/dev/null 2>&1; then echo \"$RESULT\"; else echo \"$RESULT\" >&2; fi; fi; if [ -f \"./.claude/skills/cfn-memory-persistence/lib/auto/auto-load-session-context.sh\" ]; then ./.claude/skills/cfn-memory-persistence/lib/auto/auto-load-session-context.sh --session-id \"${SESSION_ID:-$(date +%s)}\" 2>&1 || true; fi; if [ -f \"./.claude/skills/cfn-transparency-middleware/invoke-transparency-init.sh\" ]; then ./.claude/skills/cfn-transparency-middleware/invoke-transparency-init.sh --task-id \"${SESSION_ID:-session}\" --level standard 2>&1 || true; fi; echo \"[SessionStart] Context loaded\" >&2; exit 0'",
161
- "timeout": 15
161
+ "command": "nohup ~/.local/bin/wsl-memory-monitor.sh > /dev/null 2>&1 & sleep 0.5 && echo \"[WSL Memory Monitor] Running (PID: $(cat /tmp/wsl-memory-monitor.pid 2>/dev/null || echo starting))\""
162
162
  }
163
163
  ]
164
- }
165
- ],
166
- "Stop": [
164
+ },
167
165
  {
168
166
  "hooks": [
169
167
  {
170
168
  "type": "command",
171
- "command": "bash -c 'echo \"[SessionEnd] Persisting session state...\" >&2; if [ -f \"./.claude/skills/cfn-memory-persistence/lib/auto/save-session-context.sh\" ]; then ./.claude/skills/cfn-memory-persistence/lib/auto/save-session-context.sh --session-id \"${SESSION_ID:-$(date +%s)}\" 2>&1 || true; fi; if [ -f \"./.claude/skills/cfn-knowledge-base/cli/knowledge-base.sh\" ]; then ./.claude/skills/cfn-knowledge-base/cli/knowledge-base.sh store-learning --type session-end --category completed --confidence 0.85 2>&1 || true; fi; echo \"[SessionEnd] Session ended\" >&2; exit 0'",
172
- "timeout": 15
169
+ "command": "bash .claude/hooks/cfn-SessionStart-cfn-build-ruvector.sh",
170
+ "timeout": 60
173
171
  }
174
172
  ]
175
173
  }
@@ -0,0 +1,70 @@
1
+ # Claude Code Skills Development Guide
2
+
3
+ **Purpose:** Guidelines for developing, testing, and maintaining CFN skills.
4
+
5
+ ---
6
+
7
+ ## Skill Development Principles
8
+
9
+ - **Modularity:** Each skill handles one responsibility; compose skills for complex operations
10
+ - **Explicit Interfaces:** Document inputs, outputs, and side effects in SKILL.md
11
+ - **Minimal Dependencies:** Skills should be self-contained; avoid cross-skill imports
12
+ - **Thorough Testing:** Every skill needs functional tests and edge case coverage
13
+
14
+ ## Testing Requirements (STRAT-005)
15
+
16
+ Skills must include tests covering:
17
+ - Functional requirements (happy path)
18
+ - Edge cases: timeouts, blocking operations, invalid inputs
19
+ - Resource cleanup on failure
20
+
21
+ **Example test location:** `.claude/skills/cfn-coordination/test-orchestrator.sh`
22
+
23
+ ## Core Skill References
24
+
25
+ - **Coordination:** `.claude/skills/cfn-coordination/SKILL.md` - chain, broadcast, mesh, consensus patterns
26
+ - **Agent Spawning:** `.claude/skills/cfn-agent-spawning/SKILL.md` - agent lifecycle management
27
+ - **Loop Validation:** `.claude/skills/cfn-loop-validation/SKILL.md` - gate checks and consensus
28
+
29
+ ## Skill File Structure
30
+
31
+ ```
32
+ .claude/skills/<skill-name>/
33
+ ├── SKILL.md # Skill documentation (required)
34
+ ├── <main-script>.sh # Primary entry point
35
+ ├── lib/ # Helper scripts/modules
36
+ └── tests/ # Skill-specific tests
37
+ ```
38
+
39
+ ## Skill Documentation Template
40
+
41
+ ```markdown
42
+ # Skill: <name>
43
+
44
+ ## Purpose
45
+ One-line description of what this skill does.
46
+
47
+ ## Inputs
48
+ - `$1`: Description
49
+ - `ENV_VAR`: Description
50
+
51
+ ## Outputs
52
+ - stdout: Description
53
+ - exit code: 0 = success, non-zero = failure
54
+
55
+ ## Usage
56
+ \`\`\`bash
57
+ ./.claude/skills/<skill-name>/<script>.sh [args]
58
+ \`\`\`
59
+
60
+ ## Dependencies
61
+ - List required tools/skills
62
+ ```
63
+
64
+ ## Quality Checklist
65
+
66
+ - [ ] SKILL.md documents all inputs/outputs
67
+ - [ ] Scripts use `set -euo pipefail`
68
+ - [ ] Cleanup traps handle interrupts
69
+ - [ ] Tests cover happy path and failure modes
70
+ - [ ] No hardcoded paths (use `PROJECT_ROOT`)
@@ -1,25 +1,41 @@
1
+ ---
2
+ name: ruvector-code-search
3
+ description: "MANDATORY: Query RuVector BEFORE using grep, glob, find, or search. Performs 400x faster semantic and structural code search via SQL on indexed codebase. Use for finding functions, classes, patterns, callers, and implementations. Agents MUST query RuVector first; grep is only allowed after RuVector returns zero results."
4
+ allowed-tools: Bash, Read, SlashCommand
5
+ ---
6
+
1
7
  # RuVector Local Semantic Code Search
2
8
 
3
- ## WHEN TO USE THIS SKILL
9
+ ## MANDATORY: QUERY RUVECTOR BEFORE GREP/GLOB
10
+
11
+ **This is a PROTOCOL REQUIREMENT, not a suggestion. Failure to query RuVector first is a violation.**
12
+
13
+ ### WHY THIS IS MANDATORY
14
+ - RuVector SQL: 0.002s | grep: 0.8s (400x slower)
15
+ - Agents using grep first waste tokens and time
16
+ - Index already exists at `~/.local/share/ruvector/index_v2.db`
4
17
 
5
- **USE RuVector V2 SQL for ALL indexed projects (400x FASTER than grep):**
18
+ ### ALWAYS USE RUVECTOR FIRST
6
19
  ```bash
7
- # Exact name lookup - 0.002s vs grep's 0.8s
20
+ # Exact name lookup - 0.002s
8
21
  sqlite3 ~/.local/share/ruvector/index_v2.db "SELECT file_path, line_number FROM entities WHERE name = 'MyFunction';"
9
22
 
10
23
  # Fuzzy search - 0.004s
11
24
  sqlite3 ~/.local/share/ruvector/index_v2.db "SELECT file_path, line_number FROM entities WHERE name LIKE '%Store%' LIMIT 10;"
25
+
26
+ # Semantic search
27
+ /codebase-search "authentication middleware pattern"
12
28
  ```
13
29
 
14
- **USE grep/rg ONLY when:**
15
- - Project is NOT indexed yet
16
- - Searching for strings that aren't code entities (error messages, comments, config values)
17
- - Quick one-off search in small directory
30
+ ### GREP IS ONLY ALLOWED WHEN:
31
+ - RuVector query returned zero results AND project confirmed not indexed
32
+ - Searching literal strings (error messages, comments, config values)
33
+ - Explicit user request for grep
18
34
 
19
- **USE RuVector semantic search when:**
20
- - "Where is authentication implemented?" (conceptual search)
21
- - Finding similar patterns you can't name exactly
22
- - Discovering how a feature is built
35
+ ### FOR CONCEPTUAL QUESTIONS:
36
+ - "Where is X implemented?" RuVector semantic search
37
+ - "Find similar patterns" RuVector embeddings
38
+ - "How is feature Y built?" → RuVector first, then read files
23
39
 
24
40
  ## Quick Commands
25
41
 
@@ -108,20 +124,20 @@ sqlite3 ~/.local/share/ruvector/index_v2.db "SELECT project_root, COUNT(*) FROM
108
124
  ~/.local/share/ruvector/index_v2.db
109
125
  ```
110
126
 
111
- ## For Agents
127
+ ## For Agents (MANDATORY PROTOCOL)
128
+
129
+ **DO NOT use grep/glob until you have queried RuVector. This is enforced.**
112
130
 
113
- Before implementing changes, ALWAYS query RuVector first:
114
131
  ```bash
115
- # Find similar patterns (slash command uses --top, CLI uses --max-results)
132
+ # STEP 1: Query RuVector FIRST (required)
116
133
  /codebase-search "relevant search terms" --top 5
117
- # Or via CLI:
118
- local-ruvector query "relevant search terms" --max-results 5
134
+ # Or SQL:
135
+ sqlite3 ~/.local/share/ruvector/index_v2.db "SELECT file_path, line_number FROM entities WHERE name LIKE '%keyword%';"
119
136
 
120
- # Query past errors
121
- ./.claude/skills/cfn-ruvector-codebase-index/query-error-patterns.sh --task-description "description"
137
+ # STEP 2: Query past errors/patterns
138
+ ./.claude/skills/cfn-local-ruvector-accelerator/query-agent-patterns.sh "description"
122
139
 
123
- # Query learnings
124
- ./.claude/skills/cfn-ruvector-codebase-index/query-learnings.sh --task-description "description" --category PATTERN
140
+ # STEP 3: Only if RuVector returns nothing, then use grep
125
141
  ```
126
142
 
127
- This prevents duplicated work and leverages existing solutions.
143
+ **Violation of this protocol wastes tokens and time. RuVector exists to prevent duplicated work.**