Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial SCOOBE Spec added #10978

Closed
wants to merge 6 commits into from
Closed

Conversation

dedavis6797
Copy link
Contributor

@dedavis6797 dedavis6797 commented Apr 27, 2021

Summary of the Pull Request

What is this about:
Publishing the functional spec for update dialogs, aka second chance out of box experience (SCOOBE), which highlight noteworthy additions and improvements to PowerToys.

What is include in the PR:
SCOOBE Spec for public review/feedback

To view draft: click here

Tracking issue: #10979

How does someone test / validate:
N/A

Contributor License Agreement (CLA)

A CLA must be signed. If not, go over here and sign the CLA.

@dedavis6797 dedavis6797 added the Needs-Community Feedback We need additional help with how something should act / look label Apr 27, 2021
@dedavis6797 dedavis6797 added the Area-OOBE First time run experience for users label Apr 27, 2021
@microsoft microsoft deleted a comment from github-actions bot Apr 27, 2021
Copy link
Collaborator

@htcfreek htcfreek left a comment

Choose a reason for hiding this comment

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

Question.

Comment on lines 60 to 62
|9. | After SCOOBE is initially viewed, the user should be able to re-access the SCOOBE dialog at any time by opening the OOBE window again and selecting the "What's New" page. | P1 |

**\*** - By storing the content for SCOOBE externally from the application, the PowerToys team can update/adjust information without being constrained to PowerToys' release cycles. This is critical in the event of errors or miscommunications that would otherwise be difficult, if not impossible, to correct if stored locally to the app and shipped with the version of PowerToys being released.
Copy link
Collaborator

Choose a reason for hiding this comment

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

Any plans to caching the data for the case that no network is available when the user reopens the oobe section?

Copy link
Member

Choose a reason for hiding this comment

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

good call out

Copy link
Contributor

Choose a reason for hiding this comment

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

This point also applies to OOBE, but as explained in previous comment, it's important to keep them in sync. The ability to update just SCOOBE is bring little to no benefits to the users, but brings more complexity for development and testing and opens the door to inconsistencies with OOBE.

@microsoft microsoft deleted a comment from github-actions bot Apr 28, 2021

Non-Goals:

- Present a copy-and-paste replica of the repository release notes. This information needs to be readily consumable, often requiring visual demonstrations of the new behavior and/or functionality that's either not possible or not necessary to depict on the repository release notes.
Copy link
Collaborator

Choose a reason for hiding this comment

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

I think that can be achieved by adding images of the new features and links like "try it out"


**3.2. Open Discussion**

- How do we localize content like keystrokes and visuals?
Copy link
Collaborator

Choose a reason for hiding this comment

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

I would localize keystrokes not until #9482 is implemented

Copy link
Contributor

@enricogior enricogior May 3, 2021

Choose a reason for hiding this comment

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

The problem is here is not just how to localize content like keystrokes, the problem is the added complexity to the entire localization process and the fact that SCOOBE needs to implement its own logic to determine what locale should be used, adding another layer of complexity for both development and testing.

Specifications for the entire localization process and specification for how SCOOBE should programmatically manage localized resources must be fully specified.


- How do we localize content like keystrokes and visuals?

- How do we make keystrokes/activation phrases stand out?
Copy link
Collaborator

Choose a reason for hiding this comment

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

The best would be the keys styled like real keys.

Like the example from w3schools:

image

Link


- How do we handle displaying information for scenarios where a user is updating over multiple versions (ex. v0.29 -> v0.35) for which a change was made but later regressed/altered. For instance, a new FancyZones UX update in v0.31, that was again changed in v0.35?

- Should we store SCOOBE information for all versions of PowerToys? If not, how far back should we maintain information?
Copy link
Collaborator

Choose a reason for hiding this comment

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

Do we have telemetry data on how many users are using version ... . If so we should look at that for this decision

Copy link
Collaborator

@htcfreek htcfreek May 2, 2021

Choose a reason for hiding this comment

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

More interesting here are the telemetry data of update path like from 0.33 directly to 0.37.
@dedavis6797, is this covered by telemetry?

|7. | If PowerToys was installed for the first time, the OOBE's "Welcome to PowerToys" page should display first, not the SCOOBE's "What's New" page. See figure 5.1.2. | P0 |
|8. | The structure of the SCOOBE dialog page's content should follow the guidelines described in section 3.1.2. | P0 |
|9. | After SCOOBE is initially viewed, the user should be able to re-access the SCOOBE dialog at any time by opening the OOBE window again and selecting the "What's New" page. | P1 |

Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
|10. | The user should be able to choose in the settings if he wants to see the SCOOBE dialog after the next time PowerToys updates| P2 |

| --- | --- | --- |
|1. | The SCOOBE dialog should launch immediately after PowerToys is updated. | P0 |
|2. | The SCOOBE dialog should be contained inside the existing OOBE Dialog under its own "What's New" page of the dialog window. See figure 5.1.1. | P0 |
|3. | The content for the SCOOBE dialog should be stored externally from the PowerToys application. **\*** | P0 |
Copy link
Contributor

Choose a reason for hiding this comment

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

This opens the door to inconsistencies between OOBE and SCOOBE.
OOBE and SCOOBE should use the same content location otherwise the work to keep them in sync becomes a nightmare.

|1. | The SCOOBE dialog should launch immediately after PowerToys is updated. | P0 |
|2. | The SCOOBE dialog should be contained inside the existing OOBE Dialog under its own "What's New" page of the dialog window. See figure 5.1.1. | P0 |
|3. | The content for the SCOOBE dialog should be stored externally from the PowerToys application. **\*** | P0 |
|4. | When the "What's New" page is opened, the content displayed should by loaded dynamically from the relevant information contained in the external storage described in 3.1.1.3 above. Assumes the user's device is connected to the internet. | P0 |
Copy link
Contributor

Choose a reason for hiding this comment

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

This is also something that should be discussed because it makes the implementation and testing overwhelming for our team that is too small to keep adding features that provide little benefit to the users but are a potential source of bugs and add complexity to the development and testing phases.
For the end user, the fact that the content is dynamic is irrelevant and actually a potential limitation.
What is the real motivation to want dynamic content that needs to be downloaded from the internet?
Why do we need the ability to update that content after a new version has been released?
If we open SCOOBE as soon as the new version is executed, the users will see it at that time and then dismiss it.
Changing that content afterward will result in not being seen by the users that have already checked SCOOBE.
Adding a notification mechanism to alert those users that SCOOBE has been updated is another of those things that the team can't afford to do.

|2. | The SCOOBE dialog should be contained inside the existing OOBE Dialog under its own "What's New" page of the dialog window. See figure 5.1.1. | P0 |
|3. | The content for the SCOOBE dialog should be stored externally from the PowerToys application. **\*** | P0 |
|4. | When the "What's New" page is opened, the content displayed should by loaded dynamically from the relevant information contained in the external storage described in 3.1.1.3 above. Assumes the user's device is connected to the internet. | P0 |
|5. | The SCOOBE dialog should display information on updates that have occurred between the previous version of PowerToys the user had installed, and the current version of PowerToys the user has updated to. **\*\*** | P0 |
Copy link
Contributor

@enricogior enricogior May 3, 2021

Choose a reason for hiding this comment

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

This is another feature that will require a significant amount of testing and could be a potential source of bugs bringing very little benefit to the users and also limit those users that are regularly updating but might skip checking SCOOBE for some releases, but that would still like to reopen SCOOBE at a later time to check previous updates to see the new features.

Showing a version-to-version list of updates would cover all the scenarios and not have any limitation in terms of information provided.

|3. | The content for the SCOOBE dialog should be stored externally from the PowerToys application. **\*** | P0 |
|4. | When the "What's New" page is opened, the content displayed should by loaded dynamically from the relevant information contained in the external storage described in 3.1.1.3 above. Assumes the user's device is connected to the internet. | P0 |
|5. | The SCOOBE dialog should display information on updates that have occurred between the previous version of PowerToys the user had installed, and the current version of PowerToys the user has updated to. **\*\*** | P0 |
|6. | If PowerToys was installed for the first time, the SCOOBE dialog should only display information on updates that have occurred with the version of PowerToys the user has installed. | P0 |
Copy link
Contributor

Choose a reason for hiding this comment

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

Given my previous comment this would become irrelevant.


- How do we make keystrokes/activation phrases stand out?

- How do we handle displaying information for scenarios where a user is updating over multiple versions (ex. v0.29 -> v0.35) for which a change was made but later regressed/altered. For instance, a new FancyZones UX update in v0.31, that was again changed in v0.35?
Copy link
Contributor

Choose a reason for hiding this comment

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

This is a show stopped and unless there is a full specification, it is pointless to even consider starting the SCOOBE development.


| **No.** | **Requirement** | **Implication** | **Pri** |
| --- | --- | --- | --- |
|1. | Date/Time of first-run following upgrade | Helps to categorize usage and retention trends across users who've been exposed to SCOOBE. | P0 |
Copy link
Contributor

Choose a reason for hiding this comment

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

Not sure what are the implication of this requirement.
What is the date/time of the upgrade? How is this relevant given SCOOBE is shown when PowerToys is first run after the upgrade?

| **No.** | **Requirement** | **Implication** | **Pri** |
| --- | --- | --- | --- |
|1. | Date/Time of first-run following upgrade | Helps to categorize usage and retention trends across users who've been exposed to SCOOBE. | P0 |
|2. | SCOOBE section viewed | Used to measure activation of the SCOOBE dialog. Should be 100% for the current version of PowerToys following SCOOBE's inclusion. | P0 |
Copy link
Contributor

Choose a reason for hiding this comment

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

This is also very unclear. If SCOOBE is shown when the new version is executed for the first time, how could this result in a value that is not 100%?

|1. | Date/Time of first-run following upgrade | Helps to categorize usage and retention trends across users who've been exposed to SCOOBE. | P0 |
|2. | SCOOBE section viewed | Used to measure activation of the SCOOBE dialog. Should be 100% for the current version of PowerToys following SCOOBE's inclusion. | P0 |
|3. | Accesses to linked documentation | Used to gauge interest in user's desire to learn more about the PowerToys described. | P1 |
|4. | Access to linked settings pages | Used to gauge whether the settings presented to users in the dialog are sufficient for user needs. | P1 |
Copy link
Contributor

@enricogior enricogior May 3, 2021

Choose a reason for hiding this comment

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

It is unclear what this is, since the content is dynamic, how would SCOOBE detect that the user has clicked on link to the settings page for a particular module?
This requires a full specification.

|2. | SCOOBE section viewed | Used to measure activation of the SCOOBE dialog. Should be 100% for the current version of PowerToys following SCOOBE's inclusion. | P0 |
|3. | Accesses to linked documentation | Used to gauge interest in user's desire to learn more about the PowerToys described. | P1 |
|4. | Access to linked settings pages | Used to gauge whether the settings presented to users in the dialog are sufficient for user needs. | P1 |
|5. | PowerToys launched while SCOOBE window is active | Used to track user engagement with the various PowerToys while exploring the content in the SCOOBE. | P1 |
Copy link
Contributor

Choose a reason for hiding this comment

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

Same as for the previous point. This needs a full specification.

|3. | Accesses to linked documentation | Used to gauge interest in user's desire to learn more about the PowerToys described. | P1 |
|4. | Access to linked settings pages | Used to gauge whether the settings presented to users in the dialog are sufficient for user needs. | P1 |
|5. | PowerToys launched while SCOOBE window is active | Used to track user engagement with the various PowerToys while exploring the content in the SCOOBE. | P1 |
|6. | Screen size | Gives crucial information for considerations related to minimal/maximum window size needed for displaying content. | P2 |
Copy link
Contributor

@enricogior enricogior May 3, 2021

Choose a reason for hiding this comment

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

This screen size information is already available as part of the system telemetry.

@github-actions
Copy link

github-actions bot commented May 20, 2021

@check-spelling-bot Report

Unrecognized words, please review:

  • onboarding
Previously acknowledged words that are now absent apos bc bh Chris's classmethod cls cn cx cz deque df dw EB ev fd fody fx getmembers gh hc hh hk hu ip ismethod jp Kf lambson laute loadingbar messagebox multithreading nonwin NX overlaywindow pb Pn pv pw px QI rpc ru rv rx Shortcutguide sz tadele td tt tw Tz ul uv vh vk vm vw Vx wostringstream xa XY yy Zc zh zipfolder zm
To accept these unrecognized words as correct (and remove the previously acknowledged and now absent words), run the following commands

... in a clone of the [email protected]:microsoft/PowerToys.git repository
on the users/dedavis/SCOOBE_Spec branch:

update_files() {
perl -e '
my @expect_files=qw('".github/actions/spell-check/expect.txt"');
@ARGV=@expect_files;
my @stale=qw('"$patch_remove"');
my $re=join "|", @stale;
my $suffix=".".time();
my $previous="";
sub maybe_unlink { unlink($_[0]) if $_[0]; }
while (<>) {
if ($ARGV ne $old_argv) { maybe_unlink($previous); $previous="$ARGV$suffix"; rename($ARGV, $previous); open(ARGV_OUT, ">$ARGV"); select(ARGV_OUT); $old_argv = $ARGV; }
next if /^(?:$re)(?:(?:\r|\n)*$| .*)/; print;
}; maybe_unlink($previous);'
perl -e '
my $new_expect_file=".github/actions/spell-check/expect.txt";
use File::Path qw(make_path);
use File::Basename qw(dirname);
make_path (dirname($new_expect_file));
open FILE, q{<}, $new_expect_file; chomp(my @words = <FILE>); close FILE;
my @add=qw('"$patch_add"');
my %items; @items{@words} = @words x (1); @items{@add} = @add x (1);
@words = sort {lc($a)."-".$a cmp lc($b)."-".$b} keys %items;
open FILE, q{>}, $new_expect_file; for my $word (@words) { print FILE "$word\n" if $word =~ /\w/; };
close FILE;
system("git", "add", $new_expect_file);
'
}

comment_json=$(mktemp)
curl -L -s -S \
  --header "Content-Type: application/json" \
  "https://api.github.com/repos/microsoft/PowerToys/issues/comments/845246893" > "$comment_json"
comment_body=$(mktemp)
jq -r .body < "$comment_json" > $comment_body
rm $comment_json

patch_remove=$(perl -ne 'next unless s{^</summary>(.*)</details>$}{$1}; print' < "$comment_body")
  

patch_add=$(perl -e '$/=undef;
$_=<>;
s{<details>.*}{}s;
s{^#.*}{};
s{\n##.*}{};
s{(?:^|\n)\s*\*}{}g;
s{\s+}{ }g;
print' < "$comment_body")
  
update_files
rm $comment_body
git add -u
If you see a bunch of garbage

If it relates to a ...

well-formed pattern

See if there's a pattern that would match it.

If not, try writing one and adding it to the patterns.txt file.

Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

Note that patterns can't match multiline strings.

binary-ish string

Please add a file path to the excludes.txt file instead of just accepting the garbage.

File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

@github-actions
Copy link

github-actions bot commented May 20, 2021

@check-spelling-bot Report

Unrecognized words, please review:

  • onboarding
Previously acknowledged words that are now absent apos bc bh Chris's classmethod cls cn cx cz deque df dw EB ev fd fody fx getmembers gh hc hh hk hu ip ismethod jp Kf lambson laute loadingbar messagebox multithreading nonwin NX overlaywindow pb Pn pv pw px QI rpc ru rv rx Shortcutguide sz tadele td tt tw Tz ul uv vh vk vm vw Vx wostringstream xa XY yy Zc zh zipfolder zm
To accept these unrecognized words as correct (and remove the previously acknowledged and now absent words), run the following commands

... in a clone of the [email protected]:microsoft/PowerToys.git repository
on the users/dedavis/SCOOBE_Spec branch:

update_files() {
perl -e '
my @expect_files=qw('".github/actions/spell-check/expect.txt"');
@ARGV=@expect_files;
my @stale=qw('"$patch_remove"');
my $re=join "|", @stale;
my $suffix=".".time();
my $previous="";
sub maybe_unlink { unlink($_[0]) if $_[0]; }
while (<>) {
if ($ARGV ne $old_argv) { maybe_unlink($previous); $previous="$ARGV$suffix"; rename($ARGV, $previous); open(ARGV_OUT, ">$ARGV"); select(ARGV_OUT); $old_argv = $ARGV; }
next if /^(?:$re)(?:(?:\r|\n)*$| .*)/; print;
}; maybe_unlink($previous);'
perl -e '
my $new_expect_file=".github/actions/spell-check/expect.txt";
use File::Path qw(make_path);
use File::Basename qw(dirname);
make_path (dirname($new_expect_file));
open FILE, q{<}, $new_expect_file; chomp(my @words = <FILE>); close FILE;
my @add=qw('"$patch_add"');
my %items; @items{@words} = @words x (1); @items{@add} = @add x (1);
@words = sort {lc($a)."-".$a cmp lc($b)."-".$b} keys %items;
open FILE, q{>}, $new_expect_file; for my $word (@words) { print FILE "$word\n" if $word =~ /\w/; };
close FILE;
system("git", "add", $new_expect_file);
'
}

comment_json=$(mktemp)
curl -L -s -S \
  --header "Content-Type: application/json" \
  "https://api.github.com/repos/microsoft/PowerToys/issues/comments/845309208" > "$comment_json"
comment_body=$(mktemp)
jq -r .body < "$comment_json" > $comment_body
rm $comment_json

patch_remove=$(perl -ne 'next unless s{^</summary>(.*)</details>$}{$1}; print' < "$comment_body")
  

patch_add=$(perl -e '$/=undef;
$_=<>;
s{<details>.*}{}s;
s{^#.*}{};
s{\n##.*}{};
s{(?:^|\n)\s*\*}{}g;
s{\s+}{ }g;
print' < "$comment_body")
  
update_files
rm $comment_body
git add -u
If you see a bunch of garbage

If it relates to a ...

well-formed pattern

See if there's a pattern that would match it.

If not, try writing one and adding it to the patterns.txt file.

Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

Note that patterns can't match multiline strings.

binary-ish string

Please add a file path to the excludes.txt file instead of just accepting the garbage.

File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

@enricogior
Copy link
Contributor

@dedavis6797
LGTM!

@crutkas
Copy link
Member

crutkas commented Jun 10, 2021

@dedavis6797 what needs to be done here

1 similar comment
@crutkas
Copy link
Member

crutkas commented Jun 30, 2021

@dedavis6797 what needs to be done here

@github-actions
Copy link

github-actions bot commented Sep 9, 2021

@check-spelling-bot Report

Unrecognized words, please review:

  • onboarding
Previously acknowledged words that are now absent apos bc bh Chris's classmethod cls cn cx cz deque df dw EB ev fd fody fx getmembers gh hc hh hk hu ip ismethod jp Kf lambson laute loadingbar messagebox multithreading nonwin NX overlaywindow pb Pn pv pw px QI rpc ru rv rx Shortcutguide sz tadele td tt tw Tz ul uv vh vk vm vw Vx wostringstream xa XY yy Zc zh zipfolder zm
To accept these unrecognized words as correct (and remove the previously acknowledged and now absent words), run the following commands

... in a clone of the [email protected]:microsoft/PowerToys.git repository
on the users/dedavis/SCOOBE_Spec branch:

update_files() {
perl -e '
my @expect_files=qw('".github/actions/spell-check/expect.txt"');
@ARGV=@expect_files;
my @stale=qw('"$patch_remove"');
my $re=join "|", @stale;
my $suffix=".".time();
my $previous="";
sub maybe_unlink { unlink($_[0]) if $_[0]; }
while (<>) {
if ($ARGV ne $old_argv) { maybe_unlink($previous); $previous="$ARGV$suffix"; rename($ARGV, $previous); open(ARGV_OUT, ">$ARGV"); select(ARGV_OUT); $old_argv = $ARGV; }
next if /^(?:$re)(?:(?:\r|\n)*$| .*)/; print;
}; maybe_unlink($previous);'
perl -e '
my $new_expect_file=".github/actions/spell-check/expect.txt";
use File::Path qw(make_path);
use File::Basename qw(dirname);
make_path (dirname($new_expect_file));
open FILE, q{<}, $new_expect_file; chomp(my @words = <FILE>); close FILE;
my @add=qw('"$patch_add"');
my %items; @items{@words} = @words x (1); @items{@add} = @add x (1);
@words = sort {lc($a)."-".$a cmp lc($b)."-".$b} keys %items;
open FILE, q{>}, $new_expect_file; for my $word (@words) { print FILE "$word\n" if $word =~ /\w/; };
close FILE;
system("git", "add", $new_expect_file);
'
}

comment_json=$(mktemp)
curl -L -s -S \
  --header "Content-Type: application/json" \
  "https://api.github.com/repos/microsoft/PowerToys/issues/comments/916264332" > "$comment_json"
comment_body=$(mktemp)
jq -r .body < "$comment_json" > $comment_body
rm $comment_json

patch_remove=$(perl -ne 'next unless s{^</summary>(.*)</details>$}{$1}; print' < "$comment_body")
  

patch_add=$(perl -e '$/=undef;
$_=<>;
s{<details>.*}{}s;
s{^#.*}{};
s{\n##.*}{};
s{(?:^|\n)\s*\*}{}g;
s{\s+}{ }g;
print' < "$comment_body")
  
update_files
rm $comment_body
git add -u
If you see a bunch of garbage

If it relates to a ...

well-formed pattern

See if there's a pattern that would match it.

If not, try writing one and adding it to the patterns.txt file.

Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

Note that patterns can't match multiline strings.

binary-ish string

Please add a file path to the excludes.txt file instead of just accepting the garbage.

File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

@dedavis6797 dedavis6797 mentioned this pull request Sep 9, 2021
@dedavis6797 dedavis6797 closed this Sep 9, 2021
@microsoft microsoft deleted a comment Sep 10, 2021
@crutkas crutkas deleted the users/dedavis/SCOOBE_Spec branch October 22, 2021 22:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area-OOBE First time run experience for users Needs-Community Feedback We need additional help with how something should act / look
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants