<a id="ch-18"></a>

## Chapter 18 — Equality misses a near name

<!-- open-cyber-academy:lesson-figures:start ch-18 -->
### Lesson map

Lesson 18. Map, example, EX064.

```mermaid
flowchart TD
  E["d in the set of valid values"] --> Q{"Is the string exactly a member?"}
  Q -->|Yes| H["A hit"]
  Q -->|No| N["Not a hit"]
  N --> L["A near name is not in this mail list"]
```

The test is equality. This fixture does not contain a near-name row to demonstrate the miss.

### Logical drawing

```text
test
  exact membership
in this mail list
  news.example, a different name
  no one-character variant
not in the file
  a similarity score
```
<!-- open-cyber-academy:lesson-figures:end ch-18 -->

### Learning outcomes

After this chapter, you should be able to:

1. Name the test the hit line uses.
2. Say what this mail list actually uses as a non-match.
3. Refuse a variant the fixture does not contain.

### 18.1 Exact means the same characters. A lookalike would miss, and this list has none.

The hit test is `d in` a set of the valid strings. Two strings match only when they are the same sequence of characters. `news.example` fails because it is a different sequence, not because it is a sneaky variant of `donate-elmfield.example`. The chapter on limits already says exact matching misses lookalikes. That sentence is a limit of the method. This fixture does not include a lookalike row, so the print cannot be quoted as an example of one. Naming a variant the file never stored would add evidence the run did not produce.

There is no similarity function, no edit-distance, and no "close enough" threshold. A one-character change in a real message would miss for that reason. Sam's notes can say the limit exists. They cannot cite a variant this run did not see. Watching for lookalikes is a separate human task, outside the equality test, and this chapter does not turn that task into a scan of live domains.

`vol-12` remains the demonstration of a clean miss that the file does contain. Using it as a stand-in for a lookalike would blur two different failures: a wrong name, and a near name. Only the wrong name is in the list.

| Situation | In this fixture? |
|---|---|
| Exact member | Yes, two rows |
| Different name, `news.example` | Yes, and it misses |
| A one-character lookalike | No row |
| A similarity score | No function |

### 18.2 Worked example

| Offered example | In the file? | Decision |
|---|---|---|
| "`news.example` misses by equality." | Yes | Keep |
| "A lookalike would also miss, and none is listed." | The limit, without a fake row | Keep |
| "The lab caught a one-character variant." | Not a stored value | Refuse |
| "The script scores closeness." | No such call | Refuse |

> **Synthetic case.** The miss in the fixture is `news.example`.

### Errors and limits

Do not manufacture a lookalike so the limit has a trophy.

### Apply

- **EX064 — Equality.** What non-match does this mail list actually contain, and may a note add a lookalike domain the file never stored? *Rubric:* 3 = news.example is the stored non-match; the test is exact membership; a lookalike would miss but this list has no such row; do not invent one;; 2 = the stored miss is news.example and no variant is added;; 1 = one domain;; 0 = none.

<!-- open-cyber-academy:chapter-navigation:start ch-18 -->
### Continue studying — lesson 18 (chapter 18 of 20)

[← Chapter 17](#ch-17) · [Course chapter index](../SUBJECTS.md) · [Chapter 19 →](#ch-19)

Continue to the next authored lesson.
<!-- open-cyber-academy:chapter-navigation:end -->

## Worked answers

<a id="answer-ex064"></a>
**EX064.** `news.example` is the stored non-match. The test is exact membership. A lookalike would miss, but this list has no such row. Do not invent one.
