Skip to content

Commit 988f5f2

Browse files
Bissbertclaude
andcommitted
feat: add synthetic/simulant origin awareness to plugin
- Re-export list_synthetics, list_simulants, get_counterparts from mineral-database - CLI: list-presets shows origin badges, --origin/--synthetics/--simulants filters - CLI: info command displays origin, growth method, diagnostic features - /crystal-svg: documents synthetic presets, handles null CDL gracefully - /identify-gem: queries counterparts, checks diagnostic synthetic features - synthetics-simulants skill: references database preset IDs, expanded coverage - inclusions-fingerprints skill: added CVD/HPHT diamond inclusion cross-references - gemmology-expert agent: origin-aware identification and proactive counterpart mentions - Version bumped to 1.1.0 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 4b88053 commit 988f5f2

9 files changed

Lines changed: 271 additions & 32 deletions

File tree

.claude/agents/gemmology-expert.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,61 @@ Before completing any task:
109109
- [ ] Pleochroism description matches optical character
110110
- [ ] Data follows FGA curriculum conventions
111111

112+
## Origin Awareness (Synthetics and Simulants)
113+
114+
The mineral database now includes synthetic and simulant presets alongside natural gems. Be aware of the `origin` field and use it proactively:
115+
116+
### Key Principles
117+
118+
- **When asked about a natural gem**: Proactively mention available synthetic and simulant counterparts. For example, if discussing ruby, note that flame fusion, flux, and hydrothermal synthetics exist and can be queried.
119+
- **When identifying an unknown stone**: Always consider both natural and synthetic matches. A stone matching ruby's RI/SG could be natural or synthetic -- check inclusions and growth features to differentiate.
120+
- **When adding new presets**: Set the `origin` field appropriately (`natural`, `synthetic`, or `simulant`) and populate synthetic-specific fields when applicable.
121+
122+
### Query Functions
123+
124+
```python
125+
from mineral_database import list_synthetics, list_simulants, get_counterparts, list_by_origin
126+
127+
# List all synthetic presets
128+
synthetics = list_synthetics()
129+
130+
# List all simulant presets
131+
simulants = list_simulants()
132+
133+
# Get all synthetics and simulants for a given natural gem
134+
counterparts = get_counterparts("ruby") # Returns synthetic rubies + ruby simulants
135+
136+
# Filter presets by origin
137+
natural_only = list_by_origin("natural")
138+
synthetic_only = list_by_origin("synthetic")
139+
simulant_only = list_by_origin("simulant")
140+
```
141+
142+
### Synthetic Preset Fields
143+
144+
When working with synthetic or simulant presets, these additional fields may be present:
145+
146+
| Field | Description | Example |
147+
|-------|-------------|---------|
148+
| `origin` | `natural`, `synthetic`, or `simulant` | `synthetic` |
149+
| `growth_method` | Manufacturing process | `Verneuil (flame fusion)` |
150+
| `natural_counterpart_id` | Preset ID of the natural equivalent | `ruby` |
151+
| `manufacturer` | Producer name(s) | `Chatham` |
152+
| `year_first_produced` | First commercial production year | `1902` |
153+
| `diagnostic_synthetic_features` | List of identification indicators | `["curved striae", "gas bubbles"]` |
154+
155+
### CLI Commands
156+
157+
```bash
158+
# Filter by origin
159+
gemmology list-presets --origin synthetic
160+
gemmology list-presets --origin simulant
161+
162+
# View synthetic/simulant details
163+
gemmology info synthetic-ruby-verneuil
164+
gemmology info cubic-zirconia
165+
```
166+
112167
## Common Tasks
113168

114169
### Adding a New Gemstone Preset

commands/crystal-svg.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,28 @@ system[point_group]:{hkl}@distance + {hkl}@distance
124124
- **Tetragonal**: zircon, rutile
125125
- **Monoclinic**: kunzite, malachite, jadeite
126126

127+
### Synthetic and Simulant Presets
128+
129+
Synthetic and simulant presets are also available:
130+
131+
```bash
132+
# Synthetic presets
133+
gemmology crystal-svg --preset synthetic-ruby-verneuil -o /tmp/synth-ruby.svg
134+
gemmology crystal-svg --preset synthetic-emerald-flux -o /tmp/synth-emerald.svg
135+
136+
# Simulant presets
137+
gemmology crystal-svg --preset cubic-zirconia -o /tmp/cz.svg
138+
gemmology crystal-svg --preset moissanite -o /tmp/moissanite.svg
139+
140+
# List all synthetics or simulants
141+
gemmology list-presets --origin synthetic
142+
gemmology list-presets --origin simulant
143+
```
144+
145+
**Note:** Some synthetic presets (e.g., flame fusion boules) have no CDL expression because the growth form is not a natural crystal habit. In this case, the tool will display an informational message instead of generating a visualization. Use `gemmology info <preset>` to view the preset's properties.
146+
147+
When `--info-fga` is used with a synthetic or simulant preset, the info panel will include the origin (synthetic/simulant) and growth method (e.g., Verneuil, flux, hydrothermal) alongside the standard gemmological properties.
148+
127149
## Available Twin Laws
128150

129151
spinel, japan, brazil, dauphine, carlsbad, baveno, manebach, albite, trilling, fluorite, iron_cross, staurolite_60, staurolite_90

commands/identify-gem.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,17 @@ After each test, update the list of possible identifications:
113113
3. **Narrow by optical character** - SR or DR?
114114
4. **Narrow by pleochroism** - Expected for this species?
115115
5. **Confirm with spectrum/UV** - Matches expected?
116+
6. **Check for synthetic/simulant counterparts** - After narrowing candidates by RI and SG, query `get_counterparts()` from mineral_database to list which synthetics and simulants share those values. This helps identify look-alikes.
117+
118+
### Could This Be Synthetic?
119+
120+
Once a species match is established, consider whether the stone could be synthetic:
121+
122+
1. **Examine inclusions** - Check for diagnostic synthetic features (curved striae, gas bubbles, flux veils, chevron growth, seed plates). The `diagnostic_synthetic_features` field in the mineral database lists known indicators for each synthetic type.
123+
2. **Growth pattern analysis** - Straight/angular = natural; curved = flame fusion; chevron = hydrothermal.
124+
3. **Cleanliness** - Suspiciously clean stones of a species that is typically included (e.g., emerald) warrant further investigation.
125+
4. **UV fluorescence** - Synthetics may fluoresce more strongly or differently than natural counterparts.
126+
5. **Query the database** - Use `get_counterparts("<species>")` to see all known synthetic and simulant matches, including their growth methods and diagnostic features.
116127

117128
## Common Separation Problems
118129

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "gemmology-plugin"
3-
version = "1.0.2"
3+
version = "1.1.0"
44
description = "Claude Code plugin for coloured gemstone expertise and crystal visualization"
55
readme = "README.md"
66
license = { text = "MIT" }

skills/inclusions-fingerprints/SKILL.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,35 @@ Fine needle-like inclusions, often rutile in corundum.
243243
| Platinum platelets | Flame-fusion |
244244
| Too clean | Suspect all types |
245245

246+
**Database integration:** Each synthetic preset in the mineral database includes a `diagnostic_synthetic_features` field listing the key inclusion/growth indicators for that specific growth method. Query with `get_preset("<synthetic-id>")` or `mineral-db --info <id>` to retrieve the feature list.
247+
248+
### CVD and HPHT Diamond Inclusions
249+
250+
Lab-grown diamonds produced by Chemical Vapour Deposition (CVD) and High Pressure High Temperature (HPHT) methods have characteristic internal features:
251+
252+
**HPHT Diamonds:**
253+
| Feature | Description |
254+
|---------|-------------|
255+
| Metallic flux inclusions | Iron, nickel, or cobalt alloy remnants from solvent/catalyst |
256+
| Colour zoning | Sector-dependent (cuboctahedral growth sectors) |
257+
| Graining | Internal strain patterns |
258+
| Phosphorescence | Some HPHT diamonds phosphoresce (blue/green) |
259+
| Magnetic response | Metallic inclusions may make stone weakly magnetic |
260+
261+
**CVD Diamonds:**
262+
| Feature | Description |
263+
|---------|-------------|
264+
| Strain patterns | Banded birefringence under cross-polarised light |
265+
| Point inclusions | Small dark or metallic points (non-diamond carbon) |
266+
| Growth striations | Fine parallel lines from layered deposition |
267+
| Brown tint | Some as-grown CVD stones show brownish hue (removable by HPHT treatment) |
268+
| Inscriptions | Many have laser-inscribed girdle identification |
269+
270+
**Detection notes:**
271+
- Standard gemmological testing (RI, SG, thermal) cannot distinguish lab-grown from natural diamond -- both are carbon with identical properties.
272+
- Advanced techniques required: DiamondView (fluorescence imaging), photoluminescence spectroscopy, FTIR.
273+
- The `diagnostic_synthetic_features` field in the database lists method-specific indicators for CVD and HPHT presets.
274+
246275
## Microscopy Techniques
247276

248277
### Lighting Methods

skills/synthetics-simulants/SKILL.md

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,37 @@ description: >-
1111

1212
Guidance on identifying synthetic (laboratory-grown) gemstones and simulants (imitations). Understanding growth methods is key to detection.
1313

14+
## Database Integration
15+
16+
The mineral database contains preset entries for synthetics and simulants with structured data. Use the CLI or Python API to query them:
17+
18+
```bash
19+
# List all synthetics and simulants
20+
mineral-db --origin synthetic
21+
mineral-db --origin simulant
22+
23+
# Show counterparts for a natural gem (all known synthetics/simulants)
24+
mineral-db --counterparts ruby
25+
mineral-db --counterparts diamond
26+
27+
# Get detailed info on a specific synthetic/simulant preset
28+
mineral-db --info synthetic-ruby-verneuil
29+
mineral-db --info cubic-zirconia
30+
mineral-db --info luag
31+
mineral-db --info synthetic-paraiba
32+
```
33+
34+
Python API:
35+
```python
36+
from mineral_database import list_synthetics, list_simulants, get_counterparts, list_by_origin
37+
38+
# Query functions
39+
list_synthetics() # All synthetic preset IDs
40+
list_simulants() # All simulant preset IDs
41+
get_counterparts("ruby") # Synthetics + simulants for ruby
42+
list_by_origin("synthetic") # All presets with origin=synthetic
43+
```
44+
1445
## Terminology
1546

1647
| Term | Definition | Example |
@@ -33,9 +64,9 @@ Guidance on identifying synthetic (laboratory-grown) gemstones and simulants (im
3364
3. Creates pear-shaped "boule"
3465

3566
**Materials produced**:
36-
- Synthetic ruby
37-
- Synthetic sapphire (all colours)
38-
- Synthetic spinel
67+
- Synthetic ruby (preset: `synthetic-ruby-verneuil`)
68+
- Synthetic sapphire (all colours, preset: `synthetic-sapphire-verneuil`)
69+
- Synthetic spinel (preset: `synthetic-spinel-verneuil`)
3970
- Synthetic rutile
4071
- Star ruby/sapphire (with additives)
4172

@@ -58,10 +89,10 @@ Guidance on identifying synthetic (laboratory-grown) gemstones and simulants (im
5889
- Produces crystals similar to natural
5990

6091
**Materials produced**:
61-
- Flux emerald (Chatham, Gilson)
62-
- Flux ruby (Ramaura, Chatham)
92+
- Flux emerald (Chatham, Gilson; preset: `synthetic-emerald-flux`)
93+
- Flux ruby (Ramaura, Chatham; preset: `synthetic-ruby-flux`)
6394
- Flux sapphire
64-
- Flux alexandrite
95+
- Flux alexandrite (preset: `synthetic-alexandrite-flux`)
6596
- Flux spinel
6697

6798
**Detection features**:
@@ -83,10 +114,10 @@ Guidance on identifying synthetic (laboratory-grown) gemstones and simulants (im
83114
- Mimics natural geological conditions
84115

85116
**Materials produced**:
86-
- Hydrothermal emerald (Biron, Regency, Tairus)
87-
- Hydrothermal ruby
117+
- Hydrothermal emerald (Biron, Regency, Tairus; preset: `synthetic-emerald-hydrothermal`)
118+
- Hydrothermal ruby (preset: `synthetic-ruby-hydrothermal`)
88119
- Hydrothermal sapphire
89-
- Hydrothermal quartz (amethyst, citrine)
120+
- Hydrothermal quartz (amethyst, citrine; preset: `synthetic-quartz-hydrothermal`)
90121

91122
**Detection features**:
92123

@@ -112,9 +143,10 @@ Guidance on identifying synthetic (laboratory-grown) gemstones and simulants (im
112143
- Creates cylindrical crystal
113144

114145
**Materials produced**:
115-
- Synthetic alexandrite
116-
- YAG (Yttrium Aluminium Garnet)
117-
- GGG (Gadolinium Gallium Garnet)
146+
- Synthetic alexandrite (preset: `synthetic-alexandrite-czochralski`)
147+
- YAG (Yttrium Aluminium Garnet; preset: `yag`)
148+
- GGG (Gadolinium Gallium Garnet; preset: `ggg`)
149+
- LuAG (Lutetium Aluminium Garnet; preset: `luag`) -- newer simulant with higher RI than YAG
118150
- Some laser crystals
119151

120152
**Detection**:
@@ -124,7 +156,7 @@ Guidance on identifying synthetic (laboratory-grown) gemstones and simulants (im
124156

125157
### Skull Melting
126158

127-
**Used for**: Cubic zirconia (CZ)
159+
**Used for**: Cubic zirconia (CZ; preset: `cubic-zirconia`)
128160
- Not relevant for coloured stone imitation
129161
- Diamond simulant
130162

@@ -253,9 +285,10 @@ Not directly relevant for coloured stones but:
253285
| Sapphire | Glass, synthetic sapphire, synthetic spinel |
254286
| Emerald | Glass, GTD, triplets, synthetic emerald |
255287
| Alexandrite | Synthetic colour-change sapphire/spinel |
256-
| Paraiba | Apatite, glass, coated topaz |
288+
| Paraiba | Apatite, glass, coated topaz, synthetic Paraiba tourmaline (preset: `synthetic-paraiba`) |
257289
| Tanzanite | Synthetic forsterite, glass, iolite |
258290
| Jade | Serpentine, glass, dyed quartzite |
291+
| Diamond | CZ (preset: `cubic-zirconia`), moissanite (preset: `moissanite`), YAG (preset: `yag`), LuAG (preset: `luag`), GGG (preset: `ggg`) |
259292

260293
## Testing Protocol
261294

skills/synthetics-simulants/references/simulant-properties.md

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
Identification data for gemstone simulants.
44

5+
**Database integration:** All simulants with a database preset ID can be queried for full properties via `mineral-db --info <id>`. Properties shown below are for quick reference; the database is the authoritative source.
6+
57
## Diamond Simulants
68

7-
### Cubic Zirconia (CZ)
9+
### Cubic Zirconia (CZ) {#cubic-zirconia}
10+
**Database ID:** `cubic-zirconia`
811

912
| Property | Value | vs Diamond |
1013
|----------|-------|------------|
@@ -23,7 +26,8 @@ Identification data for gemstone simulants.
2326
- May show orange flash
2427
- Warm to touch (vs diamond cold)
2528

26-
### Moissanite
29+
### Moissanite {#moissanite}
30+
**Database ID:** `moissanite`
2731

2832
| Property | Value | vs Diamond |
2933
|----------|-------|------------|
@@ -42,7 +46,8 @@ Identification data for gemstone simulants.
4246
- Specific gravity lower
4347
- Needle-like inclusions possible
4448

45-
### Synthetic Rutile
49+
### Synthetic Rutile {#synthetic-rutile}
50+
**Database ID:** `synthetic-rutile`
4651

4752
| Property | Value | vs Diamond |
4853
|----------|-------|------------|
@@ -60,7 +65,8 @@ Identification data for gemstone simulants.
6065
- Yellow tint common
6166
- Historical simulant (1940s-50s)
6267

63-
### YAG (Yttrium Aluminium Garnet)
68+
### YAG (Yttrium Aluminium Garnet) {#yag}
69+
**Database ID:** `yag`
6470

6571
| Property | Value | vs Diamond |
6672
|----------|-------|------------|
@@ -76,6 +82,24 @@ Identification data for gemstone simulants.
7682
- Historical simulant (1960s-70s)
7783
- Largely replaced by CZ
7884

85+
### LuAG (Lutetium Aluminium Garnet) {#luag}
86+
**Database ID:** `luag`
87+
88+
| Property | Value | vs Diamond |
89+
|----------|-------|------------|
90+
| Composition | Lu₃Al₅O₁₂ | C |
91+
| RI | 1.842 | 2.42 |
92+
| SG | 6.73 | 3.52 |
93+
| Hardness | 8-8.5 | 10 |
94+
| Dispersion | 0.031 | 0.044 |
95+
96+
**Detection**:
97+
- Higher RI than YAG but still much lower than diamond
98+
- Very high SG (noticeably heavy)
99+
- Isotropic
100+
- Less common than CZ or moissanite
101+
- Sometimes used as coloured stone simulant
102+
79103
### Strontium Titanate (Fabulite)
80104

81105
| Property | Value | vs Diamond |
@@ -92,6 +116,11 @@ Identification data for gemstone simulants.
92116
- Historical simulant
93117
- Rarely seen today
94118

119+
### GGG (Gadolinium Gallium Garnet) {#ggg}
120+
**Database ID:** `ggg`
121+
122+
(Properties listed in main simulant tables above.)
123+
95124
### White Sapphire
96125

97126
| Property | Value | vs Diamond |
@@ -323,12 +352,13 @@ Identification data for gemstone simulants.
323352

324353
### Common Confusion Pairs
325354

326-
| Genuine | Common Simulant | Key Difference |
327-
|---------|-----------------|----------------|
328-
| Diamond | CZ | Thermal conductivity |
329-
| Diamond | Moissanite | Birefringence |
330-
| Ruby | Garnet | Optic character |
331-
| Ruby | Red spinel | RI, optic character |
332-
| Emerald | Tsavorite | RI (much higher) |
333-
| Sapphire | Blue spinel | RI, fluorescence |
334-
| Alexandrite | CC sapphire | RI, SG |
355+
| Genuine | Common Simulant | Key Difference | DB Query |
356+
|---------|-----------------|----------------|----------|
357+
| Diamond | CZ | Thermal conductivity | `mineral-db --info cubic-zirconia` |
358+
| Diamond | Moissanite | Birefringence | `mineral-db --info moissanite` |
359+
| Diamond | LuAG | RI, SG (very heavy) | `mineral-db --info luag` |
360+
| Ruby | Garnet | Optic character | |
361+
| Ruby | Red spinel | RI, optic character | |
362+
| Emerald | Tsavorite | RI (much higher) | |
363+
| Sapphire | Blue spinel | RI, fluorescence | |
364+
| Alexandrite | CC sapphire | RI, SG | |

0 commit comments

Comments
 (0)