fix(telemetry): report unless telemetry entry is explicitly disabled

Per ccyu's decision (option A), remove the consent asymmetry in ConsentResolver:
telemetry is OFF only when cordis.yml has a telemetry entry with disabled: true.
A cordis.yml with no telemetry entry now reports (allowWhenEntryAbsent defaults
to true) rather than denying. No cordis.yml, an enabled entry, and DO_NOT_TRACK/CI
are unchanged. Both no-config and absent-entry defaults stay configurable.

Updates the module/README docs and the unit tests (file-present-but-no-entry and
non-object/non-sequence roots now report). Per-file 100% coverage holds.
This commit is contained in:
imccyu
2026-07-17 14:03:39 +08:00
parent fe668a6dfe
commit a66b98d270
3 changed files with 17 additions and 17 deletions
@@ -84,23 +84,23 @@ describe('ConsentResolver cordis.yml state', () => {
.toEqual<ConsentDecision>({ allowed: true, reason: 'enabled' })
})
it('reports absent when cordis.yml has no telemetry entry, defaulting to deny', async () => {
it('reports (allows) when cordis.yml has no telemetry entry', async () => {
const yml = '- id: llm\n name: \'@deepseek-ai/dsh-llm-deepseek\'\n'
expect(await resolver.resolve(await projectDir(yml)))
.toEqual<ConsentDecision>({ allowed: false, reason: 'absent' })
.toEqual<ConsentDecision>({ allowed: true, reason: 'absent' })
})
it('can allow when the entry is absent', async () => {
it('can be told to deny when the entry is absent', async () => {
const yml = '- id: llm\n name: \'@deepseek-ai/dsh-llm-deepseek\'\n'
const decision = await new ConsentResolver({ env: {}, allowWhenEntryAbsent: true }).resolve(await projectDir(yml))
expect(decision).toEqual<ConsentDecision>({ allowed: true, reason: 'absent' })
const decision = await new ConsentResolver({ env: {}, allowWhenEntryAbsent: false }).resolve(await projectDir(yml))
expect(decision).toEqual<ConsentDecision>({ allowed: false, reason: 'absent' })
})
it('skips non-object sequence items and a non-sequence root', async () => {
it('skips non-object sequence items and a non-sequence root, still reporting absent', async () => {
expect(await resolver.resolve(await projectDir('- just-a-string\n- id: x\n name: y\n')))
.toEqual<ConsentDecision>({ allowed: false, reason: 'absent' })
.toEqual<ConsentDecision>({ allowed: true, reason: 'absent' })
expect(await resolver.resolve(await projectDir('root: not-a-sequence\n')))
.toEqual<ConsentDecision>({ allowed: false, reason: 'absent' })
.toEqual<ConsentDecision>({ allowed: true, reason: 'absent' })
})
it('honors a custom telemetry plugin name', async () => {