ワンクリックで
workshop-review-technical
Review workshop content for technical accuracy
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Review workshop content for technical accuracy
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Identify deprecated Cypher syntax in code files.
Create linear issues for the GRAC (GraphAcademy) team.
Periodically review course content for accuracy, relevance, and consistency. This includes checking for deprecated Cypher syntax.
Fact-check a single lesson against Neo4j documentation using the neo4j-docs MCP. Fixes inaccurate claims inline and appends a WHY report.
Review a single lesson for US English grammar, style, voice, and Neo4j terminology. Fixes issues inline and appends a WHY report.
Review a single lesson for pedagogical structure, lesson length, opening pattern, concept delivery, and scaffolding. Fixes issues inline and appends a WHY report.
| name | workshop-review-technical |
| description | Review workshop content for technical accuracy |
| disable-model-invocation | true |
| allowed-tools | Read, Edit, Write, Glob, Grep, Bash |
Purpose: Review workshop content for technical accuracy, query correctness, and Neo4j best practices.
When to use: After pedagogy review is complete and content is ready for technical validation.
Prerequisites:
This skill performs a technical accuracy review that checks:
This review focuses on TECHNICAL CORRECTNESS, not pedagogy or grammar.
Required:
Preparation steps:
Create TECHNICAL-REVIEW-PROGRESS.md:
# Technical Review Progress
**Workshop:** [Name]
**Reviewer:** Technical Review Skill
**Date:** [Date]
**Test Instance:** [URL or name]
## Data Model Verification
- [ ] Products: [N] nodes
- [ ] Customers: [N] nodes
- [ ] Orders: [N] nodes
- [ ] Relationships verified
## Review Status
### Module 1: [Name]
- [ ] Lesson 1 - Technical review
- [ ] Lesson 2 - Technical review
- [ ] Lesson 3 - Technical review
[Continue for all modules...]
## Issues Found
- Query error: [Description]
- Property naming: [Description]
## Review Complete
- All queries tested: Yes/No
- All verify.cypher files tested: Yes/No
- SQL comparisons verified: Yes/No
Verify the data model matches workshop:
// Check node counts
MATCH (n)
RETURN labels(n) AS label, count(n) AS count;
// Check relationship types
MATCH ()-[r]->()
RETURN type(r) AS type, count(r) AS count;
// Check properties on nodes
MATCH (n)
RETURN DISTINCT labels(n) AS label,
[key IN keys(n) | key] AS properties
LIMIT 1;
// Check properties on relationships
MATCH ()-[r]->()
RETURN DISTINCT type(r) AS type,
[key IN keys(r) | key] AS properties
LIMIT 1;
Document findings:
## Data Model
### Nodes
- `Product`: [N] nodes
- Properties: id, name, unitPrice, unitsInStock
- `Customer`: [N] nodes
- Properties: id, name, city, country
- `Order`: [N] nodes
- Properties: id, date, total
### Relationships
- `PLACED`: Customer → Order ([N] relationships)
- `ORDERS`: Order → Product ([N] relationships)
- Properties: quantity, unitPrice
Issues to flag:
For each Cypher query in lessons:
Issue 1: Property naming
❌ Wrong property names:
MATCH (c:Customer {customerId: 'ALFKI'})
RETURN c.companyName;
✅ Correct property names:
MATCH (c:Customer {id: 'ALFKI'})
RETURN c.name;
Issue 2: Case sensitivity
❌ Wrong case:
match (c:customer) return c.Name;
✅ Correct case:
MATCH (c:Customer) RETURN c.name;
Issue 3: Syntax errors
❌ Missing semicolon or wrong syntax:
MATCH (c:Customer)
WHERE c.id = ALFKI // Missing quotes
RETURN c.name
✅ Correct syntax:
MATCH (c:Customer)
WHERE c.id = 'ALFKI'
RETURN c.name;
Issue 4: Anti-patterns
❌ OPTIONAL MATCH for counts:
MATCH (c:Customer)
OPTIONAL MATCH (c)-[:PLACED]->(o:Order)
RETURN c.name, count(o);
✅ COUNT subquery:
MATCH (c:Customer)
RETURN c.name, COUNT { (c)-[:PLACED]->(:Order) } AS orderCount;
outcome and reasonFor each challenge lesson:
Test verify.cypher
outcome, reasonoutcome is booleanreason is helpful messageTest with no data
MATCH (n:NodeLabel) DETACH DELETE noutcome should be falsereason should explain what's missingTest with partial data
outcome should be false if incompletereason should indicate partial importTest with complete data
outcome should be truereason should confirm successTest solution.cypher
outcome should be true// Test 1: No data
MATCH (n:Product) DETACH DELETE n;
// Run verify.cypher - should return:
// outcome: false
// reason: "No Product nodes found. Make sure you ran the import..."
// Test 2: Partial data
CREATE (:Product {id: "1", name: "Test"});
// Run verify.cypher - should return:
// outcome: false
// reason: "Only 1 Product nodes found. Expected 77."
// Test 3: Complete data
// (Import full dataset)
// Run verify.cypher - should return:
// outcome: true
// reason: "Success! You imported 77 Product nodes."
// Test 4: Solution passes
MATCH (n:Product) DETACH DELETE n;
// Run solution.cypher
// Run verify.cypher - should return:
// outcome: true
Issues to flag:
outcome and reasonFor each SQL comparison:
Verify SQL syntax
Verify equivalence
Verify fairness
Verify metrics
Cypher query:
MATCH (c:Customer {id: 'ALFKI'})
-[:PLACED]->(:Order)
-[:ORDERS]->(p:Product)
RETURN DISTINCT p.name;
SQL equivalent:
SELECT DISTINCT p.productName
FROM customers c
JOIN orders o ON c.customerId = o.customerId
JOIN order_details od ON o.orderId = od.orderId
JOIN products p ON od.productId = p.productId
WHERE c.customerId = 'ALFKI';
Validation:
Issues to flag:
id (not customerId, productId)name (not companyName, productName)date (not orderDate)Standard property names:
id - for all entity identifiers
name - for all entity names
date - for order dates
total - for order totals
city - for customer city
country - for customer country
unitPrice - for product prices
quantity - for order quantities
Search all lessons for:
# Bad patterns to find
customerId
productId
orderId
companyName
productName
orderDate
Should be:
id
id
id
name
name
date
Issues to flag:
Pattern 1: COUNT subqueries
❌ Anti-pattern:
MATCH (c:Customer)
OPTIONAL MATCH (c)-[:PLACED]->(o:Order)
RETURN c.name, count(o);
✅ Best practice:
MATCH (c:Customer)
RETURN c.name, COUNT { (c)-[:PLACED]->(:Order) } AS orderCount;
Pattern 2: Pattern comprehensions
❌ Verbose:
MATCH (c:Customer)-[:PLACED]->(o:Order)
WITH c, collect(o.id) AS orderIds
RETURN c.name, orderIds;
✅ Concise:
MATCH (c:Customer)
RETURN c.name,
[(c)-[:PLACED]->(o:Order) | o.id] AS orderIds;
Pattern 3: Cartesian products
❌ Accidental Cartesian:
MATCH (c:Customer), (p:Product)
WHERE c.country = 'USA'
RETURN c.name, p.name;
✅ Intentional or avoided:
MATCH (c:Customer)-[:PLACED]->(:Order)-[:ORDERS]->(p:Product)
WHERE c.country = 'USA'
RETURN c.name, p.name;
Issues to flag:
Module 1 Lesson 3 should have:
All other lessons should:
Example good reference:
[.slide]
== Using Data Importer
**Reference:** See Module 1 Lesson 3 for Data Importer mechanics.
**Steps for this challenge:**
1. Upload products.csv
2. Map to Product node
3. Configure properties (table below)
4. Run import
Example bad reference (repeating mechanics):
[.slide]
== Using Data Importer
1. Click "Import" in the Aura console
2. Click "Add Data"
3. Click "Upload File"
4. Navigate to products.csv
5. Click "Open"
[... 20 more steps ...]
Issues to flag:
For each building block:
Read the claim:
Verify technically:
// Test: Do products exist?
MATCH (p:Product)
RETURN count(p) AS productCount;
// Should return 77
Verify completeness:
// Test: Do products have required properties?
MATCH (p:Product)
RETURN p.id, p.name, p.unitPrice, p.unitsInStock
LIMIT 1;
// Should return all properties
Verify usability:
Example building block tests:
// Building Block 2: "Customer→Order path complete"
MATCH path = (c:Customer)-[:PLACED]->(o:Order)
RETURN count(path) AS pathCount;
// Should return number of orders
// Building Block 3: "Customer→Order→Product path complete"
MATCH path = (c:Customer)-[:PLACED]->(:Order)-[:ORDERS]->(p:Product)
RETURN count(path) AS pathCount;
// Should return number of order line items
Issues to flag:
Update TECHNICAL-REVIEW-PROGRESS.md with results:
# Technical Review Complete
**Workshop:** [Name]
**Date Completed:** [Date]
**Test Instance:** [URL]
## Summary Assessment
### Data Model: ✅ Pass / ❌ Fail
- All nodes present: [Yes/No]
- All relationships present: [Yes/No]
- Property names consistent: [Yes/No]
### Query Accuracy: ✅ Pass / ❌ Fail
- All Cypher queries tested: [N/N]
- All queries run without errors: [Yes/No]
- Queries return expected results: [Yes/No]
### Verification Files: ✅ Pass / ❌ Fail
- All verify.cypher tested: [N/N]
- All return outcome + reason: [Yes/No]
- All solution.cypher pass verification: [Yes/No]
### SQL Comparisons: ✅ Pass / ❌ Fail
- All SQL queries validated: [N/N]
- All comparisons accurate: [Yes/No]
- All metrics defensible: [Yes/No]
### Best Practices: ✅ Pass / ❌ Fail
- Uses COUNT subqueries: [Yes/No]
- No anti-patterns found: [Yes/No]
- Property naming consistent: [Yes/No]
### Tool References: ✅ Pass / ❌ Fail
- Module 1 Lesson 3 is source of truth: [Yes/No]
- Later lessons reference correctly: [Yes/No]
- No repeated mechanics: [Yes/No]
## Issues Found
### Critical Issues (Must Fix)
1. [Query syntax error in Module X Lesson Y]
2. [verify.cypher doesn't work in Module X Lesson Y]
### Moderate Issues (Should Fix)
1. [Property naming inconsistency in Module X]
2. [SQL comparison metric inaccurate in Module Y]
### Minor Issues (Nice to Fix)
1. [Could use COUNT subquery in Module X Lesson Y]
2. [LIMIT recommended for query in Module Z]
## Test Results
### Queries Tested
- Total queries: [N]
- Passed: [N]
- Failed: [N]
### Verification Files Tested
- Total challenges: [N]
- verify.cypher working: [N/N]
- solution.cypher working: [N/N]
### SQL Comparisons Validated
- Total comparisons: [N]
- Accurate: [N]
- Issues found: [N]
## Recommendations
1. [Recommendation for improvement]
2. [Recommendation for improvement]
## Ready for Publication
[✅ / ❌] Workshop is technically accurate and ready for publication.
**Issues to resolve before publication:**
- [Issue 1]
- [Issue 2]