# Assignment 2 — How does a color become a category?
## Personal Color Analysis: Reconstructing a Contrast Rule

### 1. Scope / 研究范围
This working reconstruction isolates one mechanism: three selected colors become numerical lightness values, a contrast range, and a Low / Medium / High category. It does not reconstruct the entire personal color analysis system, detect faces, infer undertone, or recommend seasonal palettes.

本实验只重建一个机制：三个指定颜色 → 明度数值 → 明度差 → 对比度类别。原有的季节色彩网站属于另一个原型，本次不依赖它。Assignment 3 尚未开始。

### 2. What must be represented / 必须明确的信息
- Input: three six-digit sRGB HEX colors, labeled skin, hair and eyes by the user.
- Representation: one CIELAB L* value per color, using a D65 reference white.
- Relationship: contrast = maximum L* − minimum L* across the three inputs.
- Decision: Low when ΔL* < 25; Medium when 25 ≤ ΔL* < 50; High when ΔL* ≥ 50.
- Output: the three L* values, the subtraction, and a contrast category.

The thresholds 25 and 50 are designer-chosen experimental rules, not validated personal color analysis standards. The labels “skin,” “hair,” and “eyes” are supplied by the user, not recognized by the model. Classification uses full precision; displayed measurements are rounded to two decimals. This lightness range is not the WCAG contrast ratio used for text accessibility.

本模型不表示：真实面部区域、区域大小、色相、彩度、拍摄环境、相机校准、个人偏好或文化语境。输入颜色并不等于对一个人的完整认识。

### 3. Method / 测试方法
Three synthetic inputs were executed against the same JavaScript analysis module used by the working page. Only the skin-labeled color changed. Hair was held at #444444 and eyes at #665544. Grayscale skin inputs deliberately isolate lightness and reveal that the model does not validate whether a color represents real skin.

These are actual software runs with synthetic colors, NOT photographs, participant trials, or measured daylight / indoor / shadow conditions. They establish how the rule behaves, not the accuracy of personal color analysis.

| Test | Skin HEX | Hair HEX | Eyes HEX | Skin L* | Hair L* | Eyes L* | ΔL* | Classification |
|---|---|---|---|---:|---:|---:|---:|---|
| A | #707070 | #444444 | #665544 | 47.24 | 28.85 | 37.37 | 18.39 | Low |
| B | #999999 | #444444 | #665544 | 63.22 | 28.85 | 37.37 | 34.37 | Medium |
| C | #DDDDDD | #444444 | #665544 | 88.12 | 28.85 | 37.37 | 59.26 | High |

- A: 47.24 − 28.85 ≈ 18.39 → below 25 → Low.
- B: 63.22 − 28.85 ≈ 34.37 → from 25 to below 50 → Medium.
- C: 88.12 − 28.85 ≈ 59.26 → at least 50 → High.

Use the page’s Replay A / B / C buttons to reproduce these records. Raw unrounded values are included in assignment2-tests.json.

### 4. Five observations / 五条观察

1. **The system accepts values, not people.** The gray colors assigned to “skin” all produce valid classifications. The model does not verify their relation to a face. Its knowledge starts with a human labeling decision.
   **系统接收的是被命名的数值，而不是人。** 灰色被标为皮肤后也能顺利分类，说明“这是皮肤”来自输入者，而不是系统的理解。

2. **A single represented feature can change the judgment.** Hair and eyes remain fixed, yet the three skin inputs produce all three categories. This is a finding about the rule, not proof that real lighting will cause the same sequence.
   **只改变一个输入就能改变判断。** 三次测试从 Low 变为 Medium 再到 High，但这不意味着真实光线必然造成同样变化。

3. **The middle value is excluded from the decision.** In every run, eye L* lies between hair and skin. The max-minus-min rule uses only the extremes; moving an intermediate value within that range would leave the result unchanged. The latter is a consequence of the formula, not a fourth participant test.
   **中间值不参与最终差值。** 三次测试里的眼睛都位于中间，因此被展示为一个输入，却不决定结果。

4. **Categories are added by a design decision.** The measured difference is continuous, but the chosen thresholds turn it into three discrete labels. Additional boundary checks confirm that exactly 25 is Medium and exactly 50 is High. These checks verify implementation, not the validity of the thresholds.
   **类别边界是设计出来的。** 25 和 50 的意义由规则赋予；程序执行正确不代表这些划分天然正确。

5. **Numerical output loses the conditions behind the input.** The same HEX values always produce the same answer, but the model cannot know how those values were obtained. Two decimal places express computational precision, not evidence about lighting stability or a person’s “true” contrast. Whether this precision persuades viewers remains untested.
   **数值结果没有保留输入产生的条件。** 两位小数不能证明测量可靠，也不能据此声称用户更信任系统；信任问题尚未进行参与者测试。

### 5. One research question / 一个研究问题
**How stable is a person’s contrast category when the same face is photographed under different lighting conditions?**

**同一张脸在不同光照下被拍摄时，系统给出的对比度分类有多稳定？**

A future test could keep the person, camera, distance and sampled regions as consistent as possible while changing lighting. Record actual results rather than prespecifying category changes. This experiment has not yet been performed.

### 6. Short presentation script / 课堂简述
“I began with personal color analysis, but reconstructed only one rule: how three selected colors become a contrast category. The model converts colors to lightness, subtracts the minimum from the maximum, and applies two thresholds. In three synthetic tests, changing only the skin-labeled input produced Low, Medium and High. The eye input was visible but did not affect the range because it stayed between the extremes. This helped me see that the system’s judgment depends on what is represented and on boundaries chosen by its designer. My next question is whether the same person receives a stable result under different lighting.”

### 7. Credits
- Concept and reference: the author’s original Personal Color Analysis system map.
- AI collaborator: OpenAI Codex — implementation, synthetic test execution, and documentation assistance.
- Technologies: HTML, CSS, JavaScript, native browser color inputs; no external analysis library.
- Color representation: sRGB to CIELAB L* using D65 luminance coefficients.
- Experimental classification: designer-chosen lightness-range thresholds, 25 and 50.
- Hosting: OpenAI Sites.
- Tutorials: no specific tutorial followed.

### Verification limits
The shared analysis module was executed for all three records. Black/white reference values, exact category boundaries and invalid HEX rejection were checked. A mocked DOM check can exercise interface state but does not replace real-browser visual or participant testing. No camera or participant findings are claimed.
