Skip to content

docs: add release note for Signals ML feature attributes - #1925

Open
Matus Tomlein (matus-tomlein) wants to merge 5 commits into
mainfrom
release-note-signals-ml-attributes
Open

docs: add release note for Signals ML feature attributes#1925
Matus Tomlein (matus-tomlein) wants to merge 5 commits into
mainfrom
release-note-signals-ml-attributes

Conversation

@matus-tomlein

@matus-tomlein Matus Tomlein (matus-tomlein) commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

What changed?

Adds a release note at release-notes/new-in-signals-attributes-for-ml-features/ announcing the three attribute-definition additions that came out of AISP-1451:

  • time_since_last / time_since_first aggregations (AISP-1446) — recency and tenure, in s/min/h/d, computed at read time against derived_tstamp.
  • date_part modifier on timestamp properties (AISP-1448) — extract (hour_of_day, day_of_week, month_of_year) and truncate (active_day, active_week, active_month) families, applied before aggregation and also usable in criteria.
  • Optional event filter (AISP-1067) — an empty events list means the attribute is calculated from every event type.

The note is framed as a follow-on to New in Signals: ML training datasets: the dataset builder made attribute definitions the shared contract between training and serving, and these three additions widen what that contract can express.

Why?

The reference documentation for all three features shipped in #1909, but no release note went with it. Per release-notes/_README.md, docs that catch up on functionality that shipped quietly still warrant a note, and this is the follow-up PR for that docs change.

Reviewer guidance

The feature details were taken from the implementation in the Signals monorepo (the aggregation validators, the DatePart literal and its date-time property gating, and the relaxed events constraint) and cross-checked against the reference docs added in #1909, so the two should agree.

Two things worth a second opinion:

  • SDK version. The note says snowplow-signals version 0.4.8 or later. 0.4.8 is the first released version whose Attribute model carries time_since_last/time_since_first and time_unit, has date_part on the property models, and drops min_length on events — 0.4.7 has date_part only. Verified by inspecting both wheels from PyPI.
  • Optional-filter caveat. The last paragraph of that section notes that an empty event list is accepted as match-all rather than rejected, which is a deliberate behavior change from the previous 422. Worth confirming that's the right level of emphasis for a product-news audience.

Checks run locally: prettier --check passes, and a full docusaurus build succeeds with all three internal links resolving. Vale isn't installed locally, so it hasn't been run.

AI reviews

Claude will automatically review this PR against the docs style guide.

If you have questions or want it to look again at something specific, tag @claude in a comment.

🤖 Generated with Claude Code

Announces the three attribute-definition additions that support building
ML model features on Signals attributes: the time_since_last and
time_since_first aggregations, the date_part modifier on timestamp
properties, and the optional event filter.

The reference documentation for all three shipped in #1909; this is the
follow-up release note for it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 27, 2026 13:29
@github-actions

Copy link
Copy Markdown
Contributor

Missing SEO metadata

The following markdown files are missing required metadata fields:

  • release-notes/new-in-signals-attributes-for-ml-features/index.md: missing fields: keywords, sidebar_label

Required fields

The file metadata is important for SEO and marketing. All markdown files, except for those with filenames starting with _, should include:

  • title: Full, descriptive page title
  • sidebar_label: Short title for navigation sidebar (can be the same as the main title)
  • description: One to two sentences summarizing the page contents
  • keywords: Array of marketing/SEO keywords

Please add the missing metadata.

@greptile-apps

greptile-apps Bot commented Aug 27, 2026

Copy link
Copy Markdown

Greptile Summary

Adds a Signals release note describing time-since aggregations, timestamp date-part modifiers, and optional event filters, with links to the attribute and ML training-dataset references.

  • Explains recency and tenure calculations and their read-time behavior.
  • Introduces extract and truncate date-part families with composition examples.
  • Documents match-all behavior for omitted or empty event filters.
  • Provides Console and Python SDK availability guidance.

Confidence Score: 4/5

The batch-group availability claim should be corrected before merging because that group type synchronizes pre-calculated values rather than defining these attributes.

The feature details otherwise align with the reference documentation, but the release note currently directs readers toward an unsupported batch attribute-group configuration.

Files Needing Attention: release-notes/new-in-signals-attributes-for-ml-features/index.md

Important Files Changed

Filename Overview
release-notes/new-in-signals-attributes-for-ml-features/index.md The feature descriptions agree with the current attribute reference, but the final availability statement incorrectly extends attribute-definition features to batch attribute groups.

Fix all with Greploop Fix All in Claude Code

Reviews (1): Last reviewed commit: "docs: add release note for Signals ML fe..." | Re-trigger Greptile


## Get started

All three are available in Console and in the Python SDK, for both stream and batch attribute groups. Upgrade to `snowplow-signals` version 0.4.8 or later to define them from the SDK.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Batch availability is incorrect

When readers apply these attribute-definition features to a warehouse-backed batch group, the group only synchronizes pre-calculated values and performs no attribute calculation, causing them to pursue an unsupported configuration.

Suggested change
All three are available in Console and in the Python SDK, for both stream and batch attribute groups. Upgrade to `snowplow-signals` version 0.4.8 or later to define them from the SDK.
All three are available in Console and in the Python SDK for stream attribute groups. Upgrade to `snowplow-signals` version 0.4.8 or later to define them from the SDK.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Claude Code

@claude

claude Bot commented Aug 27, 2026

Copy link
Copy Markdown

Docs style review

Reviewed against CLAUDE.md and src/pages/style-guide/llm/index.md. Scope is writing quality, style, terminology, structure, frontmatter, and links only.

What is already correct: frontmatter matches release-notes/_README.md (title, description, date, category, components — all from the allowed value lists); four H2s, all sentence case and imperative; no H1; every heading and list preceded by prose; Signals, Console (no article), Profiles Store, and Python SDK all styled correctly; version 0.4.8 rather than v0.4.8; Oxford commas; straight quotes. All three internal links (/docs/signals/attributes/attributes/, /docs/signals/ml-training-datasets/, /release-notes/new-in-signals-ml-training-datasets/) resolve to existing files, and the trailing-slash form matches the convention used across release-notes/ (per _README.md, which asks for paths like /docs/signals/). No external URLs were added or modified.

Four things worth changing.

1. Passive voice (style guide, Writing style: "Use active voice")

Several of the load-bearing explanatory sentences are passive:

"The value is computed when you read the attribute, not when the event arrives"

"Out-of-order events can't push the result below zero, as it's clamped at 0."

"the attribute is calculated from every event Signals processes"

"A request that sends an empty event list is read as matching all events rather than rejected"

Suggested fixes, naming the actor (Signals) in each case:

  • "Signals computes the value when you read the attribute, not when the event arrives"
  • "Signals clamps the result at zero, so out-of-order events can't push it negative."
  • "Signals calculates the attribute from every event it processes"
  • "Signals reads a request with an empty event list as matching all events rather than rejecting it"

2. "visitor" instead of "the user" (style guide, Writing style: use "the user" for the reader's end users)

"A model scoring a visitor mid-session sees how long that visitor has actually been idle."

The rest of the note correctly says "a user" ("a user's page views", "how many separate days a user has been active"), and "visitor" appears nowhere else in docs/signals/. Suggest: "A model scoring a user mid-session sees how long that user has actually been idle."

3. Trailing periods on single-sentence list items (style guide, Lists: "No period at the end unless the item contains multiple sentences")

"time_since_last measures the duration since the most recent matching event, which is the recency signal behind re-engagement, churn, and session-freshness features."

Both bullets in that list are single sentences, so drop the final period from each.

4. Conversational asides in place of a technical tone (CLAUDE.md: "Use professional, technical tone")

Two spots read as opinion rather than description:

"A raw timestamp is close to useless as a model feature, because every value is distinct."

"it gets in the way of the whole-pipeline features that models often want, where enumerating every schema is both tedious and wrong the moment someone adds a new event."

Suggested rewrites:

  • "A raw timestamp works poorly as a model feature, because every value is distinct."
  • "...where enumerating every schema is laborious and goes out of date as soon as someone adds a new event."

Minor

  • Tense. "Signals recently gained a training dataset builder" and "until now it wasn't expressible" sit against the style guide's "Stay in the present tense. Never use 'currently', 'now'". Release notes across this directory do use "now" for what changed, so treat that as a judgment call, but "recently" adds nothing and could be dropped: "Signals gained a training dataset builder, which turns...".
  • Numeral consistency. "push the result below zero, as it's clamped at 0" mixes both forms in one sentence; pick one (the style guide's spell-out rule points at "zero").

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new Product news release note announcing three recently shipped Signals attribute-definition enhancements that make common ML features easier to express (recency/tenure aggregations, date_part modifiers for timestamp properties, and an optional event filter).

Changes:

  • Introduces a new release note page for the Signals attribute-definition updates relevant to ML feature engineering.
  • Summarizes time_since_last / time_since_first, date_part, and match-all semantics for events=[] (and related SDK guidance).
  • Provides links to the related prior release note and reference documentation.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

- "Signals"
- "AI tools"
---
Signals recently gained a [training dataset builder](/release-notes/new-in-signals-ml-training-datasets/), which turns the attribute groups you already serve from into a labeled training table in your warehouse. That closed the gap between training and serving: the same attribute definition produces the feature your model trains on and the feature it scores against.

This makes a general engagement counter a single definition rather than a list of schemas to maintain, and it means an attribute over an atomic property picks that property up wherever it appears. A first-touch `mkt_medium` attribute captures the value from whichever event carried it, with no need to work out in advance which schemas those might be.

Because an empty filter is indistinguishable from one you forgot to fill in, it has to be set deliberately. A request that sends an empty event list is read as matching all events rather than rejected, so it's worth confirming that's what you meant.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Aug 27, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
documentation 34ea665 Commit Preview URL

Branch Preview URL
Aug 27 2026, 02:20 PM

Applies the human-voice guidance: drops the preview paragraph that
restated all three sections, removes unsourced claims about how
predictive recency is and how useless raw timestamps are, replaces the
"part of the calendar that carries the signal" heading and phrasing, and
leads each section with what shipped rather than a problem/solution beat.

Also converts the two-item bullet list to prose and aligns the closing
heading with the ML training datasets note.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Restructures each section around a short Python example instead of
explaining the mechanics in prose, and replaces the date_part
explanation with a table showing what each aggregation over hour_of_day
returns. Down from 900 to 650 words.

All three examples and the aggregation table were verified by
constructing them against snowplow-signals 0.4.8.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Rewrites the note to lead with the kinds of model features these
additions enable rather than the mechanics of the API. Opens on the
timing and habit questions a propensity model asks, groups the three
changes as recency/tenure, seasonality/habit, and whole-pipeline
features, and moves the detail into deep links to the relevant docs
sections and examples.

Drops the Python examples, which duplicated the documentation, and the
dataset-builder framing from the opening sentence. Down to 575 words.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Using time since aggregations in intervention rules isn't a recommended
pattern and has edge cases, so the note shouldn't point people at it.
Keeps the read-time computation point, which is what matters for model
features.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@jborlase-snowplow jborlase-snowplow left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left a couple comments on naming


Combined with the aggregations Signals already has, that covers a useful range. Peak shopping hour, most common active weekday, an hour-by-hour histogram of when someone engages, or a count of the distinct days they have shown up, which is a decent proxy for habit. Date parts also work in [criteria](/docs/signals/attributes/attributes/#filter-with-criteria), so you can build features from weekday traffic only.

## Whole-pipeline features

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than whole-pipeline, should we call it 'All event features'?


Some features are about a user's overall activity rather than one behavior, and those needed you to list every event schema in your pipeline and keep the list current. The [event filter is now optional](/docs/signals/attributes/attributes/#select-events): leave it empty and the attribute covers every event Signals processes, including event types you add later.

That makes total engagement counters a single definition, and it lets an attribute follow a property wherever it appears, such as capturing first-touch `mkt_medium` from whichever event carried it. Worth knowing: an empty filter looks the same as one you meant to fill in and didn't, and Signals reads it as match-all rather than flagging it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this last bit mean after "Worth knowing..."?


## Seasonality and habit

A raw timestamp is close to unusable as a feature, since every value is unique. [Date parts](/docs/signals/attributes/attributes/#apply-a-date-part) reduce one to the part a model can learn from: hour of day, day of week, month of year, or the day, week, and month a user was active.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Little harsh?

@@ -0,0 +1,39 @@
---
title: "New in Signals: attributes built for ML features"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lets just call this "Recency, tenure, and time-of-day attributes"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants