Skip to content

signal: Salary Absence #14

Description

@LXBStudioLLC

Spec

Tier: Weak
Name: Salary Absence

A low-effort or possibly-ghost hint: a posting in a U.S. pay-transparency jurisdiction that leaves out any salary or pay range. Employers covered by these laws are supposed to publish a range, so leaving it out in a covered state or city is a small red flag. This is correlational and weak. Plenty of real postings leave out salary, so this only ever adds a little to the evidence.

Data source

None. This is a local signal. It uses only posting.Location, posting.SalaryText, and posting.DescriptionText, plus a small hardcoded list of pay-transparency jurisdictions. RequiresNetwork = false.

Approach

  1. Keep a small, documented hardcoded set of U.S. pay-transparency jurisdictions (for example California, Colorado, New York, Washington, Illinois, Hawaii, Minnesota, Maryland, plus a few cities). Make it easy to extend.
  2. In EvaluateAsync(JobPosting): if posting.Location clearly maps to a covered jurisdiction, and posting.SalaryText is null or blank, and posting.DescriptionText has no pay range (a dollar amount, "per hour", "salary range", and so on), return a SignalResult with a low score and low-to-moderate confidence. Return null otherwise.
  3. Be conservative on the location match. Require a Location-field match, not a description scan, and only when the jurisdiction is clear.

Precision rules

  • Weak tier, low score. This must never move a posting's band on its own.
  • Only fire on a clear covered-jurisdiction match. Remote, unknown, or not-covered returns null.
  • Describe the pattern in the evidence, for example: "This posting is in {jurisdiction}, which requires a pay range, but none is listed." Never a verdict on the company.

Acceptance criteria

  • Implements IGhostSignal with Name = "Salary Absence" and Tier = Weak
  • RequiresNetwork = false. Local only, no network, no data files
  • Returns null when the location is not a covered jurisdiction, a salary or range is present, or the location is unknown
  • Never throws. Catch and return null
  • Human-readable evidence. No verdict on a named company
  • Tests use labeled fixtures (no network calls): covered state with no salary (fires), covered state with a salary (null), non-covered or remote (null)
  • dotnet test passes, including ContainerResolutionTests
  • PR targets main

Quick start

Copy the agent prompt from SIGNAL_AUTHORING.md, paste the Spec block above into it, and hand it to your coding agent. Good first signal, no external data, just local fields.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions